From f81c5f73212993b6e6e5feea8f0ac8cb25acbc26 Mon Sep 17 00:00:00 2001 From: Yuji Ueki Date: Thu, 14 Jan 2021 22:27:04 +0900 Subject: [PATCH 1/5] :+1: Update build script --- build.forge.gradle | 393 ----------------------------- build.gradle | 600 +++++++++++--------------------------------- root.gradle.kts | 208 --------------- settings.gradle.kts | 80 ------ 4 files changed, 143 insertions(+), 1138 deletions(-) delete mode 100644 build.forge.gradle delete mode 100755 root.gradle.kts delete mode 100644 settings.gradle.kts diff --git a/build.forge.gradle b/build.forge.gradle deleted file mode 100644 index 55c47063..00000000 --- a/build.forge.gradle +++ /dev/null @@ -1,393 +0,0 @@ -import com.replaymod.gradle.preprocess.PreprocessTask - -buildscript { - def (major, minor, patch) = project.name.tokenize('-')[0].tokenize('.') - def mcVersion = "${major}${minor.padLeft(2, '0')}${(patch ?: '').padLeft(2, '0')}" as int - def fabric = false - - project.ext.mcVersion = mcVersion - project.ext.fabric = fabric - - repositories { - mavenLocal() - mavenCentral() - maven { url = "https://plugins.gradle.org/m2/" } - maven { url = "https://files.minecraftforge.net/maven" } - maven { url='https://repo.spongepowered.org/repository/maven-public/' } - maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } - maven { url = "https://maven.tterrag.com/" } - maven { url = 'https://jitpack.io' } - } - - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '4.1.+', changing: true - classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' - classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0' - } -} - -def mcVersionStr = "${(int)(mcVersion/10000)}.${(int)(mcVersion/100)%100}" + (mcVersion%100==0 ? '' : ".${mcVersion%100}") -// def jGui = project.evaluationDependsOn(":jGui:1.16.4-forge") - -apply plugin: 'com.github.johnrengelman.shadow' -apply plugin: 'net.minecraftforge.gradle' -apply plugin: 'org.spongepowered.mixin' -apply plugin: 'com.replaymod.preprocess' - -ext { - mixinSrg = new File(project.buildDir, 'tmp/mixins/mixins.srg') - mixinRefMap = new File(project.buildDir, 'tmp/mixins/mixins.replaymod.refmap.json') -} - -compileJava { - sourceCompatibility = '1.8' - targetCompatibility = '1.8' - - options.compilerArgs += [ - "-AoutSrgFile=${project.mixinSrg.canonicalPath}", - "-AoutRefMapFile=${project.mixinRefMap.canonicalPath}", - "-AreobfSrgFile=${project.file('build/mcp-srg.srg').canonicalPath}" - ] -} - -mixin { - add sourceSets.main, "mixins.replaymod.refmap.json" -} - -preprocess { - vars.put("MC", project.mcVersion) - vars.put("FABRIC", project.fabric ? 1 : 0) - - keywords.set([ - ".java": PreprocessTask.DEFAULT_KEYWORDS, - ".json": PreprocessTask.DEFAULT_KEYWORDS, - ".mcmeta": PreprocessTask.DEFAULT_KEYWORDS, - ".cfg": PreprocessTask.CFG_KEYWORDS, - ".vert": PreprocessTask.DEFAULT_KEYWORDS, - ".frag": PreprocessTask.DEFAULT_KEYWORDS, - ]) - - patternAnnotation.set("com.replaymod.gradle.remap.Pattern") -} - -sourceCompatibility = '1.8' -targetCompatibility = '1.8' - -version = project.name + '-' + rootProject.version -group= "com.replaymod" -archivesBaseName = "replaymod" - -sourceSets { - main - api - integrationTest { - compileClasspath += main.runtimeClasspath + main.output - java { - srcDir file('src/integration-test/java') - } - resources.srcDir file('src/integration-test/resources') - } -} - -minecraft { - runs { - client { - workingDirectory rootProject.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - property 'fml.earlyprogresswindow', 'false' - - arg '-mixin.config=mixins.replaymod.json' - - mods { - replaymod { - source sourceSets.main - } - } - } - - server { - workingDirectory rootProject.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - arg '-mixin.config=mixins.replaymod.json' - - mods { - replaymod { - source sourceSets.main - } - } - } - - data { - workingDirectory rootProject.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - jvmArgs ['-Dfml.earlyprogresswindow=false'] - args '--mod', 'replaymod', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - - mods { - replaymod { - source sourceSets.main - } - } - } - } - - mappings channel: 'snapshot', version: '20210309-1.16.4' -} - -repositories { - mavenLocal() - maven { url "https://repo.spongepowered.org/maven/" } - maven { - url 'https://maven.terraformersmc.com/releases/' - content { - includeGroup 'com.terraformersmc' - } - } - maven { - url 'https://jitpack.io' - content { - includeGroupByRegex 'com\\.github\\..*' - } - } -} - -configurations { - // Include dep in fat jar without relocation and, when forge supports it, without exploding (TODO) - shade - compile.extendsFrom shade - // Include dep in fat jar with relocation and minimization - shadow - compile.extendsFrom shadow -} - -dependencies { - def mixinVersion = mcVersion >= 11200 ? '0.8.2' : '0.7.11-SNAPSHOT' // Mixin 0.8 is no longer compatible with MC 1.11.2 or older - def shadeExclusions = { - // Cannot just add these to the shade configuration because they'd be inherited by the compile configuration then - exclude group: 'com.google.guava', module: 'guava-jdk5' - exclude group: 'com.google.guava', module: 'guava' // provided by MC - exclude group: 'com.google.code.gson', module: 'gson' // provided by MC - } - - minecraft 'net.minecraftforge:forge:1.16.4-35.1.37' - - annotationProcessor "org.spongepowered:mixin:$mixinVersion" - compileOnly "org.spongepowered:mixin:$mixinVersion" - shade("org.spongepowered:mixin:$mixinVersion") { transitive = false } // deps should all be bundled with MC - - // Mixin needs these (and depends on them but for some reason that's not enough. FG, did you do that?) - annotationProcessor 'com.google.code.gson:gson:2.2.4' - annotationProcessor 'com.google.guava:guava:21.0' - annotationProcessor 'org.ow2.asm:asm-tree:6.2' - annotationProcessor 'org.apache.logging.log4j:log4j-core:2.0-beta9' - - for (suffix in ['', ':natives-linux', ':natives-windows', ':natives-macos']) { - shadow('org.lwjgl:lwjgl-tinyexr:3.2.2' + suffix) { - exclude group: 'org.lwjgl', module: 'lwjgl' // comes with MC - } - } - - shadow 'com.googlecode.mp4parser:isoparser:1.1.7' - shadow 'org.apache.commons:commons-exec:1.3' - shadow 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0', shadeExclusions - shadow 'com.google.api-client:google-api-client-gson:1.20.0', shadeExclusions - shadow 'com.google.api-client:google-api-client-java6:1.20.0', shadeExclusions - shadow 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - shadow 'com.github.javagl.JglTF:jgltf-model:3af6de4' - shadow 'org.aspectj:aspectjrt:1.8.2' - shadow 'com.github.ReplayMod.JavaBlend:2.79.0:a0696f8' - shadow "com.github.ReplayMod:ReplayStudio:a1f82a7" - shadow 'com.github.ReplayMod:lwjgl-utils:27dcd66' - - // implementation(jGui){ transitive = false } // FG 1.2 puts all MC deps into the compile configuration and we don't want to shade those - testCompile 'junit:junit:4.11' -} - -File configureRelocationOutput = new File(project.buildDir, 'configureRelocation') -task configureRelocation() { - dependsOn tasks.jar - dependsOn configurations.shadow - outputs.file(configureRelocationOutput) - doLast { - def pkgs = files(configurations.shadow).filter { it.exists() }.collect { - def tree = it.isDirectory() ? fileTree(it) : zipTree(it) - def pkgs = [].toSet() - tree.visit { file -> - if (!file.directory && file.name.endsWith('.class') && file.path.contains('/')) { - def pkg = file.path.substring(0, file.path.lastIndexOf('/')) + '/' - if (pkg.startsWith('com/')) { - if (pkg.startsWith('com/google/')) { - if (!pkg.startsWith('com/google/common') && !pkg.startsWith('com/google/gson')) { - pkgs << pkg.substring(0, pkg.indexOf('/', 'com/google/'.length())) - } - } else if (!pkg.startsWith('com/replaymod')) { - pkgs << pkg.substring(0, pkg.indexOf('/', 4)) - } - } else if (pkg.startsWith('net/')) { - if (!pkg.startsWith('net/minecraft') - && !pkg.startsWith('net/fabric')) { - pkgs << pkg.substring(0, pkg.indexOf('/', 'net/'.length())) - } - } else if (pkg.startsWith('org/')) { - if (pkg.startsWith('org/apache/')) { - if (pkg.startsWith('org/apache/commons/')) { - if (!pkg.startsWith('org/apache/commons/io')) { - pkgs << pkg.substring(0, pkg.indexOf('/', 'org/apache/commons/'.length())) - } - } else if (!pkg.startsWith('org/apache/logging')) { - pkgs << pkg.substring(0, pkg.indexOf('/', 'org/apache/'.length())) - } - } else if (pkg.startsWith('org/lwjgl')) { - return // either bundled with MC or uses natives which we can't relocate - } else if (!pkg.startsWith('org/spongepowered')) { - pkgs << pkg.substring(0, pkg.indexOf('/', 4)) - } - } else if (pkg.startsWith('it/unimi/dsi/fastutil') && mcVersion >= 11400) { - return // MC uses this as well - } else if (!pkg.startsWith('javax/')) { - // Note: we cannot just use top level packages as those will be too generic and we'll run - // into this long standing bug: https://github.com/johnrengelman/shadow/issues/232 - def i = pkg.indexOf('/') - def i2 = pkg.indexOf('/', i + 1) - if (i2 > 0) { - pkgs << pkg.substring(0, i2) - } - } - } - } - pkgs - }.flatten().unique() - configureRelocationOutput.write(pkgs.join('\n')) - } -} - -// tasks.removeByName('shadowJar') // we want to base our shadowed jar on the reobfJar output, not the sourceSet output -tasks.whenTaskAdded { task -> - if(task.name.contains('shadowJar')) { - System.out.println(task + "is disabled") - task.enabled = false - } -} - -task jarCustom(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) { - classifier 'shadow' - from { new File(project.buildDir, 'reobfJar/output.jar') } - - dependsOn { tasks.configureRelocation } - dependsOn { tasks.reobfJar } - - manifest.inheritFrom tasks.jar.manifest - - configurations = [project.configurations.shadow] - // from { project.configurations.shade } - - inputs.file configureRelocationOutput - - // No need to shadow netty, MC provides it - // (actually, pre-1.12 ships a netty which is too old, so we need to shade it there anyway) - relocate 'com.github.steveice10.netty', 'io.netty' - - exclude 'com/github/steveice10/netty/**' - exclude 'it/unimi/dsi/fastutil/**' - exclude 'META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'module-info.class' - - minimize { - exclude(dependency('.*spongepowered:mixin:.*')) - } - - doFirst { - new File(project.buildDir, 'configureRelocation').readLines().each { pkg -> - def pkgName = pkg.replace('/', '.') - relocate pkgName, 'com.replaymod.lib.' + pkgName - } - } -} -tasks.assemble.dependsOn tasks.jarCustom - -jar { - classifier = 'raw' - - from files(project.mixinRefMap.canonicalPath) - manifest { - attributes 'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker', - 'FMLCorePluginContainsFMLMod': 'true', - 'FMLAT': 'replaymod_at.cfg', - 'MixinConfigs': 'mixins.replaymod.json' - } -} - -processResources { - // this will ensure that this task is redone when the versions change. - inputs.property 'version', { project.version } - inputs.property 'mcversion', { mcVersionStr } - - // replace stuff in mcmod.info (forge) and fabric.mod.json, nothing else - filesMatching(['mcmod.info', 'fabric.mod.json']) { - // replace version and mcversion - expand 'version': project.version, 'mcversion': mcVersionStr - } - - // strip comments from (strict) JSON files - filesMatching('pack.mcmeta') { - filter { line -> line.trim().startsWith('//') ? '' : line} - } - - // exclude mod meta for non-applicable loader - exclude 'fabric.mod.json' -} - -task copySrg(dependsOn: 'createMcpToSrg') { - doLast { - def tsrg = file(project.tasks.createMcpToSrg.output).readLines() - def srg = [] - def cls = '' - for (def line : tsrg) { - if (line[0] != '\t') { - srg.add('CL: ' + line) - cls = line.split(' ')[0] - } else { - def parts = line.substring(1).split(' ') - if (line.contains('(')) { - srg.add('MD: ' + cls + '/' + parts[0] + ' ' + parts[1] + ' ' + cls + '/' + parts[2] + ' ' + parts[1]) - } else { - srg.add('FD: ' + cls + '/' + parts[0] + ' ' + cls + '/' + parts[1]) - } - } - } - new File(project.buildDir, 'mcp-srg.srg').write(srg.join('\n')) - } -} -compileJava.dependsOn copySrg - -/* -// Mixin uses multiple HashMaps to generate the refmap. -// HashMaps are unordered collections and as such do not produce deterministic output. -// To fix that, we simply sort the refmap json file. -import groovy.json.JsonSlurper -import groovy.json.JsonOutput -compileJava.doLast { - // File refmapFile = mcVersion >= 10800 ? compileJava.ext.refMapFile : project.mixinRefMap - File refmapFile = project.mixinRefMap - if (refmapFile.exists()) { - def ordered - ordered = { - if (it instanceof Map) { - def sorted = new TreeMap(it) - sorted.replaceAll { k, v -> ordered(v) } - sorted - } else if (it instanceof List) { - it.replaceAll { v -> ordered(v) } - } else { - it - } - } - def json = JsonOutput.toJson(ordered(new JsonSlurper().parse(refmapFile))) - refmapFile.withWriter { it.write json } - } -} -*/ - -defaultTasks 'build' diff --git a/build.gradle b/build.gradle index 8d5c2842..1b4af2a1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,235 +1,128 @@ -import com.replaymod.gradle.preprocess.PreprocessTask - buildscript { - def mcVersion - def (major, minor, patch) = project.name.tokenize('-')[0].tokenize('.') - mcVersion = "${major}${minor.padLeft(2, '0')}${(patch ?: '').padLeft(2, '0')}" as int - def fabric = mcVersion >= 11400 && !project.name.endsWith("-forge") + def (major, minor, patch) = '1.16.4-forge'.tokenize('-')[0].tokenize('.') + def mcVersion = "${major}${minor.padLeft(2, '0')}${(patch ?: '').padLeft(2, '0')}" as int + def fabric = false + project.ext.mcVersion = mcVersion project.ext.fabric = fabric repositories { mavenLocal() - maven { - url = "https://plugins.gradle.org/m2/" - } mavenCentral() - maven { - name = "fabric" - url = "https://maven.fabricmc.net/" - } - if (!fabric) { - maven { - name = "forge" - url = "https://files.minecraftforge.net/maven" - } - } - maven { - name = "sonatype" - url = "https://oss.sonatype.org/content/repositories/snapshots/" - } - maven { url 'https://jitpack.io' } + maven { url = "https://plugins.gradle.org/m2/" } + maven { url = "https://files.minecraftforge.net/maven" } + maven { url='https://repo.spongepowered.org/repository/maven-public/' } + maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } + maven { url = "https://maven.tterrag.com/" } + maven { url = 'https://jitpack.io' } } dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '4.1.+', changing: true + classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0' - if (fabric) { - classpath 'fabric-loom:fabric-loom.gradle.plugin:0.6-SNAPSHOT' - } else if (mcVersion >= 11400) { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '4.1.+', changing: true - } else if (mcVersion >= 10800) { - classpath('com.github.ReplayMod:ForgeGradle:' + ( - mcVersion >= 11200 ? 'b64de9c' : // FG 2.3 - mcVersion >= 10904 ? '5bb7a53' : // FG 2.2 - 'fc1eabc' // FG 2.1 - ) + ':all') - } else { - classpath 'com.github.ReplayMod:ForgeGradle:5fca6853:all' // FG 1.2 - } } } -def FG4 = !fabric && mcVersion >= 11400 -def FABRIC = fabric - -def jGuiVersion = project.name -if (['1.10.2', '1.11', '1.11.2'].contains(jGuiVersion)) jGuiVersion = '1.9.4' -if (['1.12.1', '1.12.2'].contains(jGuiVersion)) jGuiVersion = '1.12' -if (['1.16.4-forge'].contains(jGuiVersion)) jGuiVersion = '1.16.4-forge' -def jGui = project.evaluationDependsOn(":jGui:$jGuiVersion") +def mcVersionStr = "${(int)(mcVersion/10000)}.${(int)(mcVersion/100)%100}" + (mcVersion%100==0 ? '' : ".${mcVersion%100}") +// def jGui = project.evaluationDependsOn(":jGui:1.16.4-forge") apply plugin: 'com.github.johnrengelman.shadow' +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'org.spongepowered.mixin' -if (mcVersion >= 10800) { - if (FABRIC) { - apply plugin: 'fabric-loom' - } else if (FG4) { - apply plugin: 'net.minecraftforge.gradle' - } else { - apply plugin: 'net.minecraftforge.gradle.forge' - } -} else { - apply plugin: 'forge' +ext { + mixinSrg = new File(project.buildDir, 'tmp/mixins/mixins.srg') + mixinRefMap = new File(project.buildDir, 'tmp/mixins/mixins.replaymod.refmap.json') } -if (!FABRIC) { - ext { - mixinSrg = new File(project.buildDir, 'tmp/mixins/mixins.srg') - mixinRefMap = new File(project.buildDir, 'tmp/mixins/mixins.replaymod.refmap.json') - } +compileJava { + sourceCompatibility = '1.8' + targetCompatibility = '1.8' - compileJava { - options.compilerArgs += [ - "-AoutSrgFile=${project.mixinSrg.canonicalPath}", - "-AoutRefMapFile=${project.mixinRefMap.canonicalPath}", - "-AreobfSrgFile=${project.file('build/mcp-srg.srg').canonicalPath}" - ] - } + options.compilerArgs += [ + "-AoutSrgFile=${project.mixinSrg.canonicalPath}", + "-AoutRefMapFile=${project.mixinRefMap.canonicalPath}", + "-AreobfSrgFile=${project.file('build/mcp-srg.srg').canonicalPath}" + ] } -apply plugin: 'com.replaymod.preprocess' - -preprocess { - vars.put("MC", project.mcVersion) - vars.put("FABRIC", project.fabric ? 1 : 0) - - keywords.set([ - ".java": PreprocessTask.DEFAULT_KEYWORDS, - ".json": PreprocessTask.DEFAULT_KEYWORDS, - ".mcmeta": PreprocessTask.DEFAULT_KEYWORDS, - ".cfg": PreprocessTask.CFG_KEYWORDS, - ".vert": PreprocessTask.DEFAULT_KEYWORDS, - ".frag": PreprocessTask.DEFAULT_KEYWORDS, - ]) - - patternAnnotation.set("com.replaymod.gradle.remap.Pattern") +mixin { + add sourceSets.main, "mixins.replaymod.refmap.json" } -def mcVersionStr = "${(int)(mcVersion/10000)}.${(int)(mcVersion/100)%100}" + (mcVersion%100==0 ? '' : ".${mcVersion%100}") - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -if (mcVersion >= 11400) { - sourceSets { - api - } -} +sourceCompatibility = '1.8' +targetCompatibility = '1.8' version = project.name + '-' + rootProject.version group= "com.replaymod" archivesBaseName = "replaymod" -if (FABRIC) { - minecraft { - refmapName = 'mixins.replaymod.refmap.json' - runConfigs.all { - ideConfigGenerated = true +sourceSets { + main + api + integrationTest { + compileClasspath += main.runtimeClasspath + main.output + java { + srcDir file('src/integration-test/java') } + resources.srcDir file('src/integration-test/resources') } -} else { - if (FG4) { - minecraft { - runs { - client { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - arg "-mixin.config=replaymod.mixins.json" - mods { - replaymod { - source sourceSets.main - } - } - } +} - server { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - arg "-mixin.config=replaymod.mixins.json" - mods { - replaymod { - source sourceSets.main - } - } - } +minecraft { + runs { + client { + workingDirectory rootProject.file('run') + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + property 'fml.earlyprogresswindow', 'false' + property 'mixin.env.disableRefMap', 'true' - data { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - arg "-mixin.config=replaymod.mixins.json" - args '--mod', 'replaymod', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + arg '-mixin.config=mixins.replaymod.json' - mods { - replaymod { - source sourceSets.main - } - } + mods { + replaymod { + source sourceSets.main } } + } - mappings channel: "snapshot", version: "20210309-1.16.4" + server { + workingDirectory rootProject.file('run') + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + property 'mixin.env.disableRefMap', 'true' + arg '-mixin.config=mixins.replaymod.json' + + mods { + replaymod { + source sourceSets.main + } + } } - } else { - minecraft { - if (mcVersion >= 10800) { - coreMod = 'com.replaymod.core.LoadingPlugin' + + data { + workingDirectory rootProject.file('run') + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + jvmArgs ['-Dfml.earlyprogresswindow=false'] + args '--mod', 'replaymod', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') + + mods { + replaymod { + source sourceSets.main + } } - runDir = "../../run" - - version = [ - 11202: '1.12.2-14.23.0.2486', - 11201: '1.12.1-14.22.0.2444', - 11200: '1.12-14.21.1.2387', - 11102: '1.11.2-13.20.0.2216', - 11100: '1.11-13.19.1.2188', - 11002: '1.10.2-12.18.2.2099', - 10904: '1.9.4-12.17.0.1976', - 10809: '1.8.9-11.15.1.1722', - 10800: '1.8-11.14.4.1563', - 10710: '1.7.10-10.13.4.1558-1.7.10', - ][mcVersion] - - mappings = [ - 11202: "snapshot_20170615", - 11201: "snapshot_20170615", - 11200: "snapshot_20170615", - 11102: "snapshot_20161220", - 11100: "snapshot_20161111", - 11002: "snapshot_20160518", - 10904: "snapshot_20160518", - 10809: "stable_22", - 10800: "snapshot_nodoc_20141130", - 10710: "stable_12", - ][mcVersion] } } -} -afterEvaluate { - if (mcVersion >= 11400) { - // No longer required in 1.13+ because all version info is in the toml file - } else { - // Note cannot use minecraft.replace because that has already been forwarded to the task by FG by now - tasks.sourceMainJava.replace '@MOD_VERSION@', project.version - // Includes intentional whitespace to stop Forge from declaring the mod to be compatible with - // a newer srg-compatible MC version (that may be using a different protocol version) - tasks.sourceMainJava.replace '@MC_VERSION@', "[ $mcVersionStr ]" - } + mappings channel: 'snapshot', version: '20210309-1.16.4' } repositories { mavenLocal() - maven { - name = "SpongePowered Repo" - url = "https://repo.spongepowered.org/maven/" - } - maven { - name = "fabric" - url = "https://maven.fabricmc.net/" - } + maven { url "https://repo.spongepowered.org/maven/" } maven { url 'https://maven.terraformersmc.com/releases/' content { @@ -253,155 +146,49 @@ configurations { compile.extendsFrom shadow } -def shadeExclusions = { - // Cannot just add these to the shade configuration because they'd be inherited by the compile configuration then - exclude group: 'com.google.guava', module: 'guava-jdk5' - exclude group: 'com.google.guava', module: 'guava' // provided by MC - exclude group: 'com.google.code.gson', module: 'gson' // provided by MC -} - dependencies { - if (FABRIC) { - minecraft 'com.mojang:minecraft:' + [ - 11404: '1.14.4', - 11502: '1.15.2', - 11601: '1.16.1', - 11603: '1.16.3', - 11604: '1.16.4', - ][mcVersion] - mappings 'net.fabricmc:yarn:' + [ - 11404: '1.14.4+build.16', - 11502: '1.15.2+build.14', - 11601: '1.16.1+build.17:v2', - 11603: '1.16.3+build.1:v2', - 11604: '1.16.4+build.6:v2', - ][mcVersion] - modCompile 'net.fabricmc:fabric-loader:' + [ - 11404: '0.7.8+build.189', - 11502: '0.7.8+build.189', - 11601: '0.8.8+build.202', - 11603: '0.9.1+build.205', - 11604: '0.10.6+build.214', - ][mcVersion] - def fabricApiVersion = [ - 11404: '0.4.3+build.247-1.14', - 11502: '0.5.1+build.294-1.15', - 11601: '0.14.0+build.371-1.16', - 11603: '0.17.1+build.394-1.16', - 11604: '0.25.1+build.416-1.16', - ][mcVersion] - def fabricApiModules = [ - "api-base", - "networking-v0", - "keybindings-v0", - "resource-loader-v0", - ] - if (mcVersion >= 11600) { - fabricApiModules.add("key-binding-api-v1") - } - fabricApiModules.each { module -> - modCompile fabricApi.module("fabric-$module", fabricApiVersion) - include fabricApi.module("fabric-$module", fabricApiVersion) - } + def mixinVersion = '0.8.2' + def shadeExclusions = { + // Cannot just add these to the shade configuration because they'd be inherited by the compile configuration then + exclude group: 'com.google.guava', module: 'guava-jdk5' + exclude group: 'com.google.guava', module: 'guava' // provided by MC + exclude group: 'com.google.code.gson', module: 'gson' // provided by MC } - if (FG4) { - minecraft 'net.minecraftforge:forge:' + [ - 11604: '1.16.4-35.1.37', - ][mcVersion] - } + minecraft 'net.minecraftforge:forge:1.16.4-35.1.37' - if (!FABRIC) { - // Mixin 0.8 is no longer compatible with MC 1.11.2 or older - def mixinVersion = mcVersion >= 11200 ? '0.8.2' : '0.7.11-SNAPSHOT' - annotationProcessor "org.spongepowered:mixin:$mixinVersion" - compileOnly "org.spongepowered:mixin:$mixinVersion" - shade("org.spongepowered:mixin:$mixinVersion") { - transitive = false // deps should all be bundled with MC - } + annotationProcessor "org.spongepowered:mixin:$mixinVersion" + compileOnly "org.spongepowered:mixin:$mixinVersion" + shade("org.spongepowered:mixin:$mixinVersion") { transitive = false } // deps should all be bundled with MC + + // Mixin needs these (and depends on them but for some reason that's not enough. FG, did you do that?) + annotationProcessor 'com.google.code.gson:gson:2.2.4' + annotationProcessor 'com.google.guava:guava:21.0' + annotationProcessor 'org.ow2.asm:asm-tree:6.2' + annotationProcessor 'org.apache.logging.log4j:log4j-core:2.0-beta9' - // Mixin needs these (and depends on them but for some reason that's not enough. FG, did you do that?) - annotationProcessor 'com.google.code.gson:gson:2.2.4' - annotationProcessor 'com.google.guava:guava:21.0' - annotationProcessor 'org.ow2.asm:asm-tree:6.2' - annotationProcessor 'org.apache.logging.log4j:log4j-core:2.0-beta9' + for (suffix in ['', ':natives-linux', ':natives-windows', ':natives-macos']) { + shadow('org.lwjgl:lwjgl-tinyexr:3.2.2' + suffix) { + exclude group: 'org.lwjgl', module: 'lwjgl' // comes with MC + } } + shadow 'com.googlecode.mp4parser:isoparser:1.1.7' shadow 'org.apache.commons:commons-exec:1.3' shadow 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0', shadeExclusions shadow 'com.google.api-client:google-api-client-gson:1.20.0', shadeExclusions shadow 'com.google.api-client:google-api-client-java6:1.20.0', shadeExclusions shadow 'com.google.oauth-client:google-oauth-client-jetty:1.20.0' - - if (mcVersion >= 11400) { // need lwjgl 3 - for (suffix in ['', ':natives-linux', ':natives-windows', ':natives-macos']) { - shadow('org.lwjgl:lwjgl-tinyexr:3.2.2' + suffix) { - exclude group: 'org.lwjgl', module: 'lwjgl' // comes with MC - } - } - } - shadow 'com.github.javagl.JglTF:jgltf-model:3af6de4' - - if (FABRIC) { - shadow 'org.apache.maven:maven-artifact:3.6.1' - } - shadow 'org.aspectj:aspectjrt:1.8.2' - shadow 'com.github.ReplayMod.JavaBlend:2.79.0:a0696f8' - - shadow "com.github.ReplayMod:ReplayStudio:a1f82a7", shadeExclusions - - implementation(jGui){ - transitive = false // FG 1.2 puts all MC deps into the compile configuration and we don't want to shade those - } + shadow "com.github.ReplayMod:ReplayStudio:a1f82a7" shadow 'com.github.ReplayMod:lwjgl-utils:27dcd66' - if (FABRIC) { - if (mcVersion >= 11602) { - modCompile 'com.terraformersmc:modmenu:1.16.8' - } else if (mcVersion >= 11600) { - modCompile 'io.github.prospector:modmenu:1.14.0+build.24' - } else { - modCompile 'io.github.prospector.modmenu:ModMenu:1.6.2-92' - } - } - + // implementation(jGui){ transitive = false } // FG 1.2 puts all MC deps into the compile configuration and we don't want to shade those testCompile 'junit:junit:4.11' } -if (mcVersion <= 10710) { - // FG 1.2 adds all MC deps to the compile configuration which we don't want - afterEvaluate { - // Remove them from the compile and runtime configurations - configurations.compile.extendsFrom -= [configurations.minecraft, configurations.minecraftDeps] - configurations.runtime.extendsFrom -= [configurations.forgeGradleStartClass] - // And add them to the source sets instead - sourceSets.main.with { - compileClasspath += configurations.minecraft + configurations.minecraftDeps - runtimeClasspath += configurations.minecraft + configurations.minecraftDeps + configurations.forgeGradleStartClass - } - // Also need to reconfigure the reobf task, so it can properly re-obfuscates inherited members - tasks.reobf.obfOutput.all { artifact -> - artifact.getFile() // force resolve - artifact.classpath += configurations.minecraft + configurations.minecraftDeps - } - } - - // Test sources aren't preprocessed and I can't be bothered to fix that - tasks.compileTestJava.onlyIf { false } -} - -if (FABRIC) { - tasks.remapJar { - addNestedDependencies.set(true) - afterEvaluate { // FIXME why does loom overwrite this if we set it immediately? - archiveClassifier.set('obf') - } - } -} - File configureRelocationOutput = new File(project.buildDir, 'configureRelocation') task configureRelocation() { dependsOn tasks.jar @@ -416,7 +203,7 @@ task configureRelocation() { def pkg = file.path.substring(0, file.path.lastIndexOf('/')) + '/' if (pkg.startsWith('com/')) { if (pkg.startsWith('com/google/')) { - if (!pkg.startsWith('com/google/common')) { + if (!pkg.startsWith('com/google/common') && !pkg.startsWith('com/google/gson')) { pkgs << pkg.substring(0, pkg.indexOf('/', 'com/google/'.length())) } } else if (!pkg.startsWith('com/replaymod')) { @@ -469,65 +256,49 @@ tasks.whenTaskAdded { task -> } task jarCustom(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) { - from { (FABRIC ? tasks.remapJar : tasks.jar).archiveFile.get() } - dependsOn { FABRIC ? tasks.remapJar : (mcVersion >= 10800 ? tasks.reobfJar : tasks.reobf) } + classifier 'shadow' + from { new File(project.buildDir, 'reobfJar/output.jar') } - from({ zipTree((FABRIC ? jGui.tasks.remapJar : jGui.tasks.jar).archiveFile.get()) }) { - filesMatching('mixins.jgui.json') { - filter { it.replace('de.johni0702', 'com.replaymod.lib.de.johni0702') } - } - filesMatching('mixins.jgui.refmap.json') { - filter { it.replace('de/johni0702', 'com/replaymod/lib/de/johni0702') } - } - } - dependsOn { FABRIC ? jGui.tasks.remapJar : (mcVersion >= 10800 ? jGui.tasks.reobfJar : jGui.tasks.reobf) } - relocate 'de.johni0702', 'com.replaymod.lib.de.johni0702' + dependsOn { tasks.configureRelocation } + dependsOn { tasks.reobfJar } manifest.inheritFrom tasks.jar.manifest - from project.configurations.shade configurations = [project.configurations.shadow] - exclude 'META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'assets/*', 'module-info.class' + // from { project.configurations.shade } - dependsOn tasks.configureRelocation - inputs.file(configureRelocationOutput) - doFirst { - configureRelocationOutput.readLines().each { pkg -> - def pkgName = pkg.replace('/', '.') - relocate pkgName, 'com.replaymod.lib.' + pkgName - } - } + inputs.file configureRelocationOutput // No need to shadow netty, MC provides it // (actually, pre-1.12 ships a netty which is too old, so we need to shade it there anyway) - if (mcVersion >= 11200) { - relocate 'com.github.steveice10.netty', 'io.netty' - exclude 'com/github/steveice10/netty/**' - } + relocate 'com.github.steveice10.netty', 'io.netty' - if (mcVersion >= 11400) { - // MC ships this - exclude 'it/unimi/dsi/fastutil/**' - } + exclude 'com/github/steveice10/netty/**' + exclude 'it/unimi/dsi/fastutil/**' + exclude 'META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'module-info.class' minimize { exclude(dependency('.*spongepowered:mixin:.*')) } + + doFirst { + new File(project.buildDir, 'configureRelocation').readLines().each { pkg -> + def pkgName = pkg.replace('/', '.') + relocate pkgName, 'com.replaymod.lib.' + pkgName + } + } } tasks.assemble.dependsOn tasks.jarCustom jar { classifier = 'raw' - if (!FABRIC) { - from files(project.mixinRefMap.canonicalPath) - manifest { - attributes 'TweakClass': 'com.replaymod.core.tweaker.ReplayModTweaker', - 'TweakOrder': '0', - 'FMLCorePluginContainsFMLMod': 'true', - 'FMLCorePlugin': 'com.replaymod.core.LoadingPlugin', - 'FMLAT': 'replaymod_at.cfg' - } + from files(project.mixinRefMap.canonicalPath) + manifest { + attributes 'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker', + 'FMLCorePluginContainsFMLMod': 'true', + 'FMLAT': 'replaymod_at.cfg', + 'MixinConfigs': 'mixins.replaymod.json' } } @@ -548,115 +319,30 @@ processResources { } // exclude mod meta for non-applicable loader - if (FABRIC) { - exclude 'mcmod.info' - } else { - exclude 'fabric.mod.json' - } + exclude 'fabric.mod.json' } -sourceSets { - integrationTest { - compileClasspath += main.runtimeClasspath + main.output - java { - srcDir file('src/integration-test/java') - } - resources.srcDir file('src/integration-test/resources') - } -} - -if (FABRIC) { - // not required, fabric manages those by itself just fine -} else if (FG4) { - task copySrg(dependsOn: 'createMcpToSrg') { - doLast { - def tsrg = file(project.tasks.createMcpToSrg.output).readLines() - def srg = [] - def cls = '' - for (def line : tsrg) { - if (line[0] != '\t') { - srg.add('CL: ' + line) - cls = line.split(' ')[0] +task copySrg(dependsOn: 'createMcpToSrg') { + doLast { + def tsrg = file(project.tasks.createMcpToSrg.output).readLines() + def srg = [] + def cls = '' + for (def line : tsrg) { + if (line[0] != '\t') { + srg.add('CL: ' + line) + cls = line.split(' ')[0] + } else { + def parts = line.substring(1).split(' ') + if (line.contains('(')) { + srg.add('MD: ' + cls + '/' + parts[0] + ' ' + parts[1] + ' ' + cls + '/' + parts[2] + ' ' + parts[1]) } else { - def parts = line.substring(1).split(' ') - if (line.contains('(')) { - srg.add('MD: ' + cls + '/' + parts[0] + ' ' + parts[1] + ' ' + cls + '/' + parts[2] + ' ' + parts[1]) - } else { - srg.add('FD: ' + cls + '/' + parts[0] + ' ' + cls + '/' + parts[1]) - } + srg.add('FD: ' + cls + '/' + parts[0] + ' ' + cls + '/' + parts[1]) } } - new File(project.buildDir, 'mcp-srg.srg').write(srg.join('\n')) } + new File(project.buildDir, 'mcp-srg.srg').write(srg.join('\n')) } - compileJava.dependsOn copySrg -} else { - task copySrg(type: Copy, dependsOn: 'genSrgs') { - from {project.tasks.genSrgs.mcpToSrg} - into 'build' - } - compileJava.dependsOn copySrg -} - -if (!FABRIC && !FG4) { - if (mcVersion <= 10710) { - reobf.addExtraSrgFile project.mixinSrg - } else { - reobfJar.addSecondarySrgFile project.mixinSrg - } -} - -/* FIXME -// Mixin uses multiple HashMaps to generate the refmap. -// HashMaps are unordered collections and as such do not produce deterministic output. -// To fix that, we simply sort the refmap json file. -import groovy.json.JsonSlurper -import groovy.json.JsonOutput -compileJava.doLast { - File refmapFile = mcVersion >= 10800 ? compileJava.ext.refMapFile : project.mixinRefMap - if (refmapFile.exists()) { - def ordered - ordered = { - if (it instanceof Map) { - def sorted = new TreeMap(it) - sorted.replaceAll { k, v -> ordered(v) } - sorted - } else if (it instanceof List) { - it.replaceAll { v -> ordered(v) } - } else { - it - } - } - def json = JsonOutput.toJson(ordered(new JsonSlurper().parse(refmapFile))) - refmapFile.withWriter { it.write json } - } -} -*/ - -if (!FG4 && !FABRIC) { // FIXME -task runIntegrationTest(type: JavaExec, dependsOn: ["makeStart", "jar"]) { - main = 'GradleStart' - standardOutput = System.out - errorOutput = System.err - workingDir file(minecraft.runDir) - - def testDir = new File(minecraft.runDir, "integration-test") - doFirst { - testDir.deleteDir() - testDir.mkdirs() - } - - doLast { - testDir.deleteDir() - } - - afterEvaluate { - def runClient = tasks.getByName("runClient") - runIntegrationTest.jvmArgs = runClient.jvmArgs + "-Dfml.noGrab=true" - runIntegrationTest.args = runClient.args + "--gameDir" + testDir.canonicalPath - runIntegrationTest.classpath runClient.classpath + sourceSets.integrationTest.output - } -} } +compileJava.dependsOn copySrg defaultTasks 'build' diff --git a/root.gradle.kts b/root.gradle.kts deleted file mode 100755 index a1835b89..00000000 --- a/root.gradle.kts +++ /dev/null @@ -1,208 +0,0 @@ -import groovy.json.JsonOutput -import java.io.ByteArrayOutputStream - -plugins { - id("fabric-loom") version "0.6-SNAPSHOT" apply false - id("com.replaymod.preprocess") version "3d85a00" - id("com.github.hierynomus.license") version "0.15.0" -} - -val latestVersion = file("version.txt").readLines().first() -var releaseCommit = command("git", "blame", "-p", "-l", "version.txt").first().split(" ").first() -if (latestVersion == "2.1.0") { // First version since change from tag-based - releaseCommit = "35ac26e91689ac9bdf12dbb9902c452464a75108" // git rev-parse 1.12.2-2.1.0 -} -val currentCommit = command("git", "rev-parse", "HEAD").first() -if (releaseCommit == currentCommit) { - version = latestVersion -} else { - val diff = command("git", "log", "--format=oneline", "$releaseCommit..$currentCommit").size - version = "$latestVersion-$diff-g${currentCommit.substring(0, 7)}" -} -if (gitDescribe().endsWith("*")) { - version = "$version-dirty" -} - -group = "com.replaymod" - -val shadowJar by tasks.creating(Copy::class) { - into("$buildDir/libs") -} - -subprojects { - buildscript { - repositories { - maven("https://jitpack.io") - } - } - - afterEvaluate { - val projectShadowJar = project.tasks.findByName("jarCustom") - if (projectShadowJar != null && projectShadowJar.hasProperty("archivePath") && project.name != "core") { - shadowJar.dependsOn(projectShadowJar) - shadowJar.from(projectShadowJar.withGroovyBuilder { getProperty("archivePath") }) - } - } -} - -fun gitDescribe(): String { - try { - val stdout = ByteArrayOutputStream() - exec { - commandLine("git", "describe", "--always", "--dirty=*") - standardOutput = stdout - } - return stdout.toString().trim() - } catch (e: Throwable) { - return "unknown" - } -} - -fun command(vararg cmd: Any): List { - val stdout = ByteArrayOutputStream() - exec { - commandLine(*cmd) - standardOutput = stdout - } - return stdout.toString().trim().split("\n") -} - -fun generateVersionsJson(): Map { - // Find all tag-style releases by listing all tags - val tagVersions = command("git", "for-each-ref", "--sort=taggerdate", "--format=%(refname:short)", "refs/tags") - - // Find all commit-style releases - // List all commits - val releaseCommits = - command("git", "log", "--format=%H", "--date-order", "-E", - "--grep", "Pre-release [0-9]+ of [0-9]+\\.[0-9]+\\.[0-9]+", - "--grep", "Release [0-9]+\\.[0-9]+\\.[0-9]+") - // Find version string and MC versions for each commit hash - val commitVersions = releaseCommits.map { commit -> - val version = command("git", "show", "$commit:version.txt").first() - val mcVersions = command("git", "ls-tree", "-d", "--name-only", "$commit:versions") - // In the past (early days of preprocessor) we used to have an internal "core" project - .filter { it != "core" } - // Internal project used to automatically remap from Forge 1.12.2 to Fabric 1.14.4 - .filter { it != "1.16.5-forge" } - mcVersions.map { "$it-$version" } - }.flatten() - - val versions = commitVersions + tagVersions.reversed() - val mcVersions = versions - .map {it.substring(0, it.indexOf("-"))} - .distinct() - .sortedWith(compareBy( - { (it.split(".").getOrNull(0) ?: "0").toInt() }, - { (it.split(".").getOrNull(1) ?: "0").toInt() }, - { (it.split(".").getOrNull(2) ?: "0").toInt() } - )) - - val promos = mutableMapOf() - val root = mutableMapOf( - "homepage" to "https://www.replaymod.com/download/", - "promos" to promos - ) - mcVersions.forEach { mcVersion -> - var mcVersionRoot = mutableMapOf() - var latest: String? = null - var recommended: String? = null - versions.forEach { - val (thisMcVersion, modVersion, preVersion) = it.split("-") + listOf(null, null) - if (thisMcVersion == mcVersion) { - mcVersionRoot[it] = "See https://www.replaymod.com/changelog.txt" - if (latest == null) latest = it - if (preVersion == null) { - if (recommended == null) recommended = it - } - } - } - root[mcVersion] = mcVersionRoot - promos[mcVersion + "-latest"] = latest!! - if (recommended != null) { - promos[mcVersion + "-recommended"] = recommended!! - } - } - return root -} - -val doRelease by tasks.registering { - doLast { - // Parse version - val version = project.extra["releaseVersion"] as String - if (gitDescribe().endsWith("*")) { - throw InvalidUserDataException("Git working tree is dirty. Make sure to commit all changes.") - } - val (modVersion, preVersion) = if ("-b" in version) { - version.split("-b") - } else { - listOf(version, null) - } - - // Merge release branch into stable but do not yet commit (we need to update the version.txt first) - command("git", "checkout", "stable") - command("git", "merge", "--no-ff", "--no-commit", "release-$version") - - // Update version.txt - file("version.txt").writeText("$version\n") - command("git", "add", "version.txt") - - // Finallize the merge. The message is what is later used to identify releses for building the version.json tree - val commitMessage = if (preVersion != null) - "Pre-release $preVersion of $modVersion" - else - "Release $modVersion" - command("git", "commit", "-m", commitMessage) - - // Generate versions.json content - val versionsRoot = generateVersionsJson() - val versionsJson = JsonOutput.prettyPrint(JsonOutput.toJson(versionsRoot)) - - // Switch to master branch to update versions.json - command("git", "checkout", "master") - - // Write versions.json - File("versions.json").writeText(versionsJson) - - // Commit changes - project.exec { commandLine("git", "add", "versions.json") } - project.exec { commandLine("git", "commit", "-m", "Update versions.json for $version") } - - // Return to previous branch - project.exec { commandLine("git", "checkout", "-") } - } -} - -defaultTasks("jarCustom") - -preprocess { - "1.16.4"(11604, "yarn") { - "1.16.1"(11601, "yarn") { - "1.15.2"(11502, "yarn") { - "1.14.4"(11404, "yarn", file("versions/mapping-fabric-1.15.2-1.14.4.txt")) { - } - } - } - "1.16.4-forge"(11604, "srg", file("versions/mapping-1.16.4-fabric-forge.txt")) { - "1.12.2"(11202, "srg", file("versions/1.14.4-forge/mapping.txt")) { - "1.12.1"(11201, "srg") { - "1.12"(11200, "srg") { - "1.11.2"(11102, "srg", file("versions/1.12/mapping.txt")) { - "1.11"(11100, "srg", file("versions/1.11.2/mapping.txt")) { - "1.10.2"(11002, "srg", file("versions/1.11/mapping.txt")) { - "1.9.4"(10904, "srg") { - "1.8.9"(10809, "srg", file("versions/1.9.4/mapping.txt")) { - "1.8"(10800, "srg", file("versions/1.8.9/mapping.txt")) { - "1.7.10"(10710, "srg", file("versions/1.8/mapping.txt")) - } - } - } - } - } - } - } - } - } - } - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts deleted file mode 100644 index 326ef522..00000000 --- a/settings.gradle.kts +++ /dev/null @@ -1,80 +0,0 @@ -pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - mavenCentral() - google() - maven("https://jitpack.io") - maven("https://maven.fabricmc.net") - } - resolutionStrategy { - eachPlugin { - when (requested.id.id) { - "com.replaymod.preprocess" -> { - useModule("com.github.replaymod:preprocessor:${requested.version}") - } - } - } - } -} - -val jGuiVersions = listOf( - /*"1.7.10", - "1.8", - "1.8.9", - "1.9.4", - "1.12", - */ - "1.14.4", - "1.15.2", - "1.16.1", - "1.16.4-forge", - "1.16.4" -) -val replayModVersions = listOf( - /*"1.7.10", - "1.8", - "1.8.9", - "1.9.4", - "1.10.2", - "1.11", - "1.11.2", - "1.12", - "1.12.1", - "1.12.2", - */ - "1.14.4", - "1.15.2", - "1.16.1", - "1.16.4-forge", - "1.16.4" -) - -rootProject.buildFileName = "root.gradle.kts" - -include(":jGui") -project(":jGui").apply { - projectDir = file("jGui") - buildFileName = "preprocess.gradle.kts" -} -jGuiVersions.forEach { version -> - include(":jGui:$version") - project(":jGui:$version").apply { - projectDir = file("jGui/versions/$version") - buildFileName = "../../build.gradle" - } -} - -replayModVersions.forEach { version -> - include(":$version") - project(":$version").apply { - System.out.println(version) - - projectDir = file("versions/$version") - if (version.contains("-forge")) { - buildFileName = "../../build.forge.gradle" - } else { - buildFileName = "../../build.gradle" - } - } -} From ebb0dec3b65705a57d8838e8fd8a600a3601e7b7 Mon Sep 17 00:00:00 2001 From: Yuji Ueki Date: Fri, 22 Jan 2021 22:27:04 +0900 Subject: [PATCH 2/5] :shower: Update src --- .../java/IntegrationTest.java | 30 - .../java/com/replaymod/core/AbstractTask.java | 340 --------- .../com/replaymod/core/CompositeTask.java | 41 -- .../core/ReplayModIntegrationTest.java | 78 --- .../java/com/replaymod/core/Task.java | 35 - .../java/com/replaymod/core/Utils.java | 9 - .../java/com/replaymod/core/Wait.java | 21 - .../core/regression/RegressionTest60.java | 59 -- .../core/regression/RegressionTest61.java | 35 - .../core/regression/RegressionTest62.java | 28 - .../com/replaymod/extra/DownloadOpenEye.java | 29 - .../java/com/replaymod/online/SkipLogin.java | 14 - .../replaymod/recording/CreateSPWorld.java | 32 - .../com/replaymod/recording/ExitSPWorld.java | 36 - .../java/com/replaymod/replay/ExitReplay.java | 16 - .../java/com/replaymod/replay/LoadReplay.java | 32 - .../replaymod/replay/OpenReplayViewer.java | 15 - .../com/replaymod/replay/SpectatePlayer.java | 42 -- .../replaymod/replay/overlay/OverlayGui.java | 33 - .../simplepathing/GuiPathingTasks.java | 35 - .../compat/optifine/DisableFastRender.java | 10 +- .../compat/optifine/OptifineReflection.java | 4 +- .../compat/shaders/ShaderBeginRender.java | 8 +- .../compat/shaders/ShaderReflection.java | 8 +- .../core/DummyChainLoadEntryPoint.java | 32 +- .../replaymod/core/KeyBindingRegistry.java | 68 +- .../java/com/replaymod/core/ReplayMod.java | 60 +- .../com/replaymod/core/ReplayModBackend.java | 47 +- .../replaymod/core/ReplayModMMLauncher.java | 144 ++-- .../core/ReplayModNonMMLauncher.java | 120 ++-- .../core/SettingsRegistryBackend.java | 6 +- .../core/events/PostRenderWorldCallback.java | 2 +- .../replaymod/core/gui/GuiReplaySettings.java | 8 +- .../replaymod/core/gui/ModMenuApiImpl.java | 38 +- .../replaymod/core/gui/RestoreReplayGui.java | 4 +- .../core/tweaker/ReplayModTweaker.java | 123 +++- .../replaymod/core/utils/ModInfoGetter.java | 26 +- .../replaymod/core/utils/Restrictions.java | 12 +- .../java/com/replaymod/core/utils/Utils.java | 38 +- .../replaymod/core/utils/WrappedTimer.java | 18 +- .../core/versions/LangResourcePack.java | 38 +- .../com/replaymod/core/versions/MCVer.java | 62 +- .../com/replaymod/core/versions/Patterns.java | 118 ++-- .../core/versions/forge/EventsAdapter.java | 66 +- .../versions/scheduler/SchedulerImpl.java | 38 +- .../replaymod/editor/gui/GuiEditReplay.java | 6 +- .../replaymod/editor/handler/GuiHandler.java | 4 +- .../com/replaymod/extras/FullBrightness.java | 18 +- .../com/replaymod/extras/HotkeyButtons.java | 8 +- .../GuiCreateScreenshot.java | 10 +- .../ScreenshotRenderer.java | 22 +- .../advancedscreenshots/ScreenshotWriter.java | 8 +- .../extras/modcore/ModCoreInstaller.java | 2 +- .../extras/playeroverview/PlayerOverview.java | 4 +- .../playeroverview/PlayerOverviewGui.java | 20 +- .../extras/youtube/GuiYoutubeUpload.java | 6 +- .../extras/youtube/VideoVisibility.java | 4 +- .../extras/youtube/YoutubeUploader.java | 6 +- .../java/com/replaymod/gui/GuiRenderer.java | 6 +- .../replaymod/gui/MinecraftGuiRenderer.java | 34 +- .../com/replaymod/gui/OffsetGuiRenderer.java | 6 +- .../java/com/replaymod/gui/RenderInfo.java | 6 +- .../gui/container/AbstractGuiContainer.java | 20 +- .../gui/container/AbstractGuiOverlay.java | 40 +- .../gui/container/AbstractGuiScreen.java | 22 +- .../gui/container/VanillaGuiScreen.java | 184 ++--- .../gui/element/AbstractGuiButton.java | 36 +- .../gui/element/AbstractGuiCheckbox.java | 16 +- .../gui/element/AbstractGuiElement.java | 10 +- .../gui/element/AbstractGuiImage.java | 24 +- .../gui/element/AbstractGuiLabel.java | 22 +- .../gui/element/AbstractGuiSlider.java | 4 +- .../gui/element/AbstractGuiTextField.java | 40 +- .../element/AbstractGuiTexturedButton.java | 14 +- .../gui/element/AbstractGuiTooltip.java | 16 +- .../com/replaymod/gui/element/GuiElement.java | 4 +- .../com/replaymod/gui/element/IGuiButton.java | 12 +- .../com/replaymod/gui/element/IGuiImage.java | 6 +- .../gui/element/IGuiTexturedButton.java | 10 +- .../advanced/AbstractGuiDropdownMenu.java | 20 +- .../advanced/AbstractGuiProgressBar.java | 10 +- .../element/advanced/AbstractGuiTextArea.java | 44 +- .../advanced/AbstractGuiTimelineTime.java | 2 +- .../gui/popup/GuiFileChooserPopup.java | 2 +- .../gui/utils/EventRegistrations.java | 10 +- .../com/replaymod/gui/utils/MouseUtils.java | 14 +- .../com/replaymod/gui/utils/StringUtils.java | 6 +- .../com/replaymod/gui/versions/Image.java | 18 +- .../com/replaymod/gui/versions/MCVer.java | 82 +-- .../callbacks/InitScreenCallback.java | 4 +- .../callbacks/PostRenderScreenCallback.java | 2 +- .../versions/callbacks/RenderHudCallback.java | 2 +- .../gui/versions/forge/EventsAdapter.java | 179 +++-- .../mixin/AbstractButtonWidgetAccessor.java | 4 +- .../mixin/AddServerScreenAccessor.java | 6 +- .../mixin/EntityLivingBaseAccessor.java | 4 +- .../replaymod/mixin/EntityPlayerAccessor.java | 4 +- .../mixin/FirstPersonRendererAccessor.java | 16 +- .../replaymod/mixin/GuiMainMenuAccessor.java | 8 +- .../replaymod/mixin/GuiScreenAccessor.java | 8 +- .../mixin/IntegratedServerAccessor.java | 2 +- .../replaymod/mixin/ItemRendererAccessor.java | 6 +- .../replaymod/mixin/KeyBindingAccessor.java | 6 +- .../replaymod/mixin/MainWindowAccessor.java | 4 +- .../replaymod/mixin/MinecraftAccessor.java | 30 +- .../java/com/replaymod/mixin/MixinCamera.java | 16 +- .../mixin/MixinClientPlayNetHandler.java | 45 ++ .../mixin/MixinDownloadingPackFinder.java | 10 +- .../replaymod/mixin/MixinEntityRenderer.java | 2 +- .../mixin/MixinFMLHandshakeHandler.java | 41 ++ .../replaymod/mixin/MixinGameRenderer.java | 10 +- .../replaymod/mixin/MixinGuiSpectator.java | 6 +- .../com/replaymod/mixin/MixinInGameHud.java | 6 +- .../mixin/MixinKeyboardListener.java | 10 +- .../com/replaymod/mixin/MixinMinecraft.java | 24 +- .../java/com/replaymod/mixin/MixinMouse.java | 8 +- .../com/replaymod/mixin/MixinMouseHelper.java | 14 +- .../replaymod/mixin/MixinMouseListener.java | 106 +-- .../mixin/MixinNetHandlerLoginClient.java | 39 +- .../mixin/MixinNetHandlerPlayClient.java | 38 +- .../replaymod/mixin/MixinParticleManager.java | 22 +- .../java/com/replaymod/mixin/MixinRender.java | 4 +- .../com/replaymod/mixin/MixinRenderArrow.java | 14 +- .../replaymod/mixin/MixinRenderGlobal.java | 4 +- .../com/replaymod/mixin/MixinRenderItem.java | 12 +- .../mixin/MixinRenderLivingBase.java | 6 +- .../replaymod/mixin/MixinRenderManager.java | 24 +- .../java/com/replaymod/mixin/MixinScreen.java | 14 +- .../com/replaymod/mixin/MixinServerInfo.java | 18 +- .../mixin/MixinShaderEntityRenderer.java | 2 +- .../mixin/MixinShaderRenderChunk.java | 16 +- .../replaymod/mixin/MixinShadersRender.java | 8 +- .../MixinTileEntityEndPortalRenderer.java | 6 +- .../com/replaymod/mixin/MixinViewFrustum.java | 18 +- .../com/replaymod/mixin/MixinWorldClient.java | 36 +- .../mixin/Mixin_BlockOnChunkRebuilds.java | 36 +- .../mixin/Mixin_ChromaKeyColorSky.java | 10 +- .../mixin/Mixin_ChromaKeyDisableFog.java | 6 +- .../mixin/Mixin_ChromaKeyForceSky.java | 10 +- .../mixin/Mixin_ContextualKeyBindings.java | 14 +- .../mixin/Mixin_EntityLivingBaseAccessor.java | 14 +- .../mixin/Mixin_ForceChunkLoading.java | 36 +- .../mixin/Mixin_HideDynamicResourcePacks.java | 42 +- .../replaymod/mixin/Mixin_HideNameTags.java | 4 +- .../Mixin_HideNameTags_LivingEntity.java | 4 +- .../mixin/Mixin_KeyboardListener.java | 8 +- .../mixin/Mixin_MoveRealmsButton.java | 6 +- .../mixin/Mixin_Omnidirectional_Camera.java | 8 +- ...Omnidirectional_DisableFrustumCulling.java | 6 +- .../mixin/Mixin_Omnidirectional_Rotation.java | 8 +- .../mixin/Mixin_Omnidirectional_SkipHand.java | 8 +- .../mixin/Mixin_ParticleManager.java | 6 +- .../mixin/Mixin_PlayerControllerMP.java | 30 +- ...ixin_PreserveDepthDuringHandRendering.java | 2 +- .../Mixin_RegisterDynamicResourcePacks.java | 82 +-- .../replaymod/mixin/Mixin_RenderGlobal.java | 6 +- .../mixin/Mixin_RenderHudCallback.java | 50 +- .../com/replaymod/mixin/Mixin_RenderItem.java | 6 +- .../mixin/Mixin_RenderLivingBase.java | 10 +- .../replaymod/mixin/Mixin_RenderManager.java | 20 +- .../mixin/Mixin_ShowSpectatedHand_NoOF.java | 16 +- .../mixin/Mixin_ShowSpectatedHand_OF.java | 12 +- .../Mixin_SkipBlockOutlinesDuringRender.java | 10 +- .../mixin/Mixin_StabilizeCamera.java | 40 +- .../mixin/Mixin_Stereoscopic_Camera.java | 12 +- .../Mixin_Stereoscopic_HandRenderPass.java | 2 +- .../mixin/NetworkManagerAccessor.java | 4 +- .../mixin/NetworkRegistryAccessor.java | 16 + .../com/replaymod/mixin/ParticleAccessor.java | 6 +- .../mixin/SPacketSpawnMobAccessor.java | 6 +- .../mixin/SPacketSpawnPlayerAccessor.java | 6 +- .../com/replaymod/mixin/TimerAccessor.java | 12 +- .../mixin/WorldRendererAccessor.java | 6 +- .../pathing/gui/GuiKeyframeRepository.java | 6 +- .../player/AbstractTimelinePlayer.java | 16 +- .../replaymod/pathing/player/ReplayTimer.java | 12 +- .../pathing/properties/SpectatorProperty.java | 2 +- .../recording/ReplayModRecording.java | 12 +- .../replaymod/recording/ServerInfoExt.java | 6 +- .../recording/gui/GuiRecordingControls.java | 8 +- .../recording/gui/GuiRecordingOverlay.java | 20 +- .../recording/gui/GuiSavingReplay.java | 10 +- .../handler/ConnectionEventHandler.java | 28 +- .../recording/handler/GuiHandler.java | 20 +- .../handler/RecordingEventHandler.java | 156 ++--- .../recording/packet/PacketListener.java | 124 ++-- .../packet/ResourcePackRecorder.java | 78 +-- .../replaymod/render/CameraPathExporter.java | 16 +- .../java/com/replaymod/render/EXRWriter.java | 4 +- .../com/replaymod/render/FFmpegWriter.java | 16 +- .../java/com/replaymod/render/PNGWriter.java | 4 +- .../com/replaymod/render/RenderSettings.java | 14 +- .../com/replaymod/render/ReplayModRender.java | 14 +- .../render/blend/BlendFrameCapturer.java | 4 +- .../render/blend/BlendMaterials.java | 4 +- .../render/blend/BlendMeshBuilder.java | 38 +- .../replaymod/render/blend/BlendState.java | 42 +- .../java/com/replaymod/render/blend/Util.java | 22 +- .../blend/exporters/EntityExporter.java | 4 +- .../render/blend/exporters/ItemExporter.java | 32 +- .../exporters/ModelRendererExporter.java | 16 +- .../blend/exporters/ParticlesExporter.java | 16 +- .../blend/exporters/TileEntityExporter.java | 20 +- .../render/capturer/ODSFrameCapturer.java | 16 +- .../render/capturer/OpenGlFrameCapturer.java | 14 +- .../capturer/PboOpenGlFrameCapturer.java | 4 +- .../replaymod/render/gui/GuiExportFailed.java | 18 +- .../replaymod/render/gui/GuiRenderQueue.java | 28 +- .../render/gui/GuiRenderSettings.java | 22 +- .../render/gui/GuiRenderingDone.java | 2 +- .../render/gui/GuiVideoRenderer.java | 32 +- .../render/hooks/EntityRendererHandler.java | 6 +- .../render/hooks/ForceChunkLoadingHook.java | 2 +- .../render/hooks/IForceChunkLoading.java | 2 +- .../replaymod/render/rendering/Pipeline.java | 20 +- .../render/rendering/VideoRenderer.java | 116 ++-- .../com/replaymod/render/shader/Program.java | 10 +- .../replaymod/replay/FullReplaySender.java | 338 ++++----- .../replaymod/replay/InputReplayTimer.java | 14 +- .../com/replaymod/replay/NoGuiScreenshot.java | 28 +- .../replaymod/replay/QuickReplaySender.java | 44 +- .../com/replaymod/replay/ReplayHandler.java | 120 ++-- .../com/replaymod/replay/ReplayModReplay.java | 20 +- .../com/replaymod/replay/ReplaySender.java | 4 +- .../replaymod/replay/camera/CameraEntity.java | 350 +++++----- .../camera/ClassicCameraController.java | 22 +- .../camera/SpectatorCameraController.java | 30 +- .../camera/VanillaCameraController.java | 26 +- .../replay/events/ReplayChatMessageEvent.java | 36 +- .../replay/gui/overlay/GuiMarkerTimeline.java | 4 +- .../replay/gui/overlay/GuiReplayOverlay.java | 14 +- .../gui/screen/GuiModCompatWarning.java | 2 +- .../replay/gui/screen/GuiReplayViewer.java | 32 +- .../replaymod/replay/handler/GuiHandler.java | 70 +- .../simplepathing/ReplayModSimplePathing.java | 10 +- .../replaymod/simplepathing/SPTimeline.java | 22 +- .../simplepathing/gui/GuiEditKeyframe.java | 4 +- .../gui/GuiKeyframeTimeline.java | 24 +- .../simplepathing/gui/GuiPathing.java | 22 +- .../preview/PathPreviewRenderer.java | 110 +-- src/main/resources/assets/replaymod/.DS_Store | Bin 6148 -> 0 bytes src/main/resources/mixins.core.replaymod.json | 4 +- src/main/resources/mixins.jgui.json | 14 +- .../simplepathing/SPTimelineTest.java | 647 ------------------ 244 files changed, 3065 insertions(+), 4362 deletions(-) delete mode 100644 src/integration-test/java/IntegrationTest.java delete mode 100644 src/integration-test/java/com/replaymod/core/AbstractTask.java delete mode 100644 src/integration-test/java/com/replaymod/core/CompositeTask.java delete mode 100644 src/integration-test/java/com/replaymod/core/ReplayModIntegrationTest.java delete mode 100644 src/integration-test/java/com/replaymod/core/Task.java delete mode 100644 src/integration-test/java/com/replaymod/core/Utils.java delete mode 100644 src/integration-test/java/com/replaymod/core/Wait.java delete mode 100644 src/integration-test/java/com/replaymod/core/regression/RegressionTest60.java delete mode 100644 src/integration-test/java/com/replaymod/core/regression/RegressionTest61.java delete mode 100644 src/integration-test/java/com/replaymod/core/regression/RegressionTest62.java delete mode 100644 src/integration-test/java/com/replaymod/extra/DownloadOpenEye.java delete mode 100644 src/integration-test/java/com/replaymod/online/SkipLogin.java delete mode 100644 src/integration-test/java/com/replaymod/recording/CreateSPWorld.java delete mode 100644 src/integration-test/java/com/replaymod/recording/ExitSPWorld.java delete mode 100644 src/integration-test/java/com/replaymod/replay/ExitReplay.java delete mode 100644 src/integration-test/java/com/replaymod/replay/LoadReplay.java delete mode 100644 src/integration-test/java/com/replaymod/replay/OpenReplayViewer.java delete mode 100644 src/integration-test/java/com/replaymod/replay/SpectatePlayer.java delete mode 100644 src/integration-test/java/com/replaymod/replay/overlay/OverlayGui.java delete mode 100644 src/integration-test/java/com/replaymod/simplepathing/GuiPathingTasks.java create mode 100644 src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java create mode 100644 src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java create mode 100644 src/main/java/com/replaymod/mixin/NetworkRegistryAccessor.java delete mode 100644 src/main/resources/assets/replaymod/.DS_Store delete mode 100644 src/test/java/com/replaymod/simplepathing/SPTimelineTest.java diff --git a/src/integration-test/java/IntegrationTest.java b/src/integration-test/java/IntegrationTest.java deleted file mode 100644 index 6f39680e..00000000 --- a/src/integration-test/java/IntegrationTest.java +++ /dev/null @@ -1,30 +0,0 @@ -import org.apache.commons.io.FileUtils; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Entry point for running integration tests from within the IDE. - * This is not called when running integration tests directly from gradle. - */ -public class IntegrationTest { - public static void main(String[] args) throws Throwable { - // Prevent MC from grabbing our mouse during the test (it's not needed) - System.setProperty("fml.noGrab", "true"); - - // Make sure the test folder exists and is fresh - File gameDir = new File(System.getProperty("user.dir"), "integration-test"); - if (gameDir.exists()) { - FileUtils.forceDelete(gameDir); - } - FileUtils.forceMkdir(gameDir); - - // Set game dir to test folder and call regular entry point - List argsList = new ArrayList<>(Arrays.asList(args)); - argsList.add("--gameDir"); - argsList.add(gameDir.getCanonicalPath()); - GradleStart.main(argsList.toArray(new String[argsList.size()])); - } -} diff --git a/src/integration-test/java/com/replaymod/core/AbstractTask.java b/src/integration-test/java/com/replaymod/core/AbstractTask.java deleted file mode 100644 index 7320023b..00000000 --- a/src/integration-test/java/com/replaymod/core/AbstractTask.java +++ /dev/null @@ -1,340 +0,0 @@ -package com.replaymod.core; - -import com.google.common.collect.Iterables; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.SettableFuture; -import de.johni0702.minecraft.gui.container.AbstractGuiOverlay; -import de.johni0702.minecraft.gui.container.AbstractGuiScreen; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.container.GuiOverlay; -import de.johni0702.minecraft.gui.container.GuiScreen; -import de.johni0702.minecraft.gui.element.GuiButton; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.element.GuiTexturedButton; -import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; -import de.johni0702.minecraft.gui.utils.Consumer; -import net.minecraft.client.Minecraft; -import net.minecraft.client.settings.KeyBinding; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.lwjgl.input.Keyboard; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.concurrent.TimeoutException; - -import static com.replaymod.core.ReplayModIntegrationTest.LOGGER; -import static com.replaymod.core.utils.Utils.addCallback; - -public abstract class AbstractTask implements Task { - public static Task create(Consumer init) { - return new AbstractTask() { - @Override - protected void init() { - init.consume(this); - } - }; - } - - public static final Minecraft mc = Minecraft.getMinecraft(); - public final ReplayMod core = ReplayMod.instance; - public SettableFuture future; - - @Override - public ListenableFuture execute() { - future = SettableFuture.create(); - - MinecraftForge.EVENT_BUS.register(this); - addCallback(future, success -> { - MinecraftForge.EVENT_BUS.unregister(this); - }, error -> {}); - - init(); - - return future; - } - - protected void init() {} - - protected void runLater(Runnable runnable) { - core.runLater(() -> { - try { - runnable.run(); - } catch (Throwable t) { - future.setException(t); - } - }); - } - - public void expectGuiClosed(Runnable onClosed) { - expectGuiClosed0(10, onClosed); - } - - public void expectGuiClosed(int timeout, Runnable onClosed) { - expectGuiClosed0(timeout, onClosed); - } - - private void expectGuiClosed0(int timeout, Runnable onClosed) { - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - class EventHandler { - final net.minecraft.client.gui.GuiScreen currentScreen = mc.currentScreen; - int framesPassed; - - @SubscribeEvent - public void onGuiOpen(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.START) return; - if (currentScreen != mc.currentScreen) { - MinecraftForge.EVENT_BUS.unregister(this); - onClosed.run(); - } else { - if (framesPassed < timeout) { - framesPassed++; - } else { - Object gui = (gui = GuiScreen.from(currentScreen)) == null ? currentScreen : gui; - Exception e = new TimeoutException("Timeout while waiting for " + gui + " to be closed."); - e.setStackTrace(Arrays.copyOfRange(stackTrace, 3, stackTrace.length)); - future.setException(e); - } - } - } - } - MinecraftForge.EVENT_BUS.register(new EventHandler()); - } - - public void expectPopupClosed(Runnable onClosed) { - expectPopupClosed0(10, onClosed); - } - - public void expectPopupClosed(int timeout, Runnable onClosed) { - expectPopupClosed0(timeout, onClosed); - } - - private void expectPopupClosed0(int timeout, Runnable onClosed) { - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - AbstractGuiPopup popup = getPopup(mc.currentScreen); - if (popup == null) { - throw new IllegalStateException("No popup found."); - } - class EventHandler { - int framesPassed; - - @SubscribeEvent - public void onGuiOpen(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.START) return; - if (getPopup(mc.currentScreen) != popup) { - MinecraftForge.EVENT_BUS.unregister(this); - onClosed.run(); - } else { - if (framesPassed < timeout) { - framesPassed++; - } else { - Exception e = new TimeoutException("Timeout while waiting for " + popup + " to be closed."); - e.setStackTrace(Arrays.copyOfRange(stackTrace, 3, stackTrace.length)); - future.setException(e); - } - } - } - } - MinecraftForge.EVENT_BUS.register(new EventHandler()); - } - - private AbstractGuiPopup getPopup(net.minecraft.client.gui.GuiScreen minecraft) { - GuiContainer container = GuiOverlay.from(minecraft); - if (container == null) { - container = GuiScreen.from(minecraft); - } - if (container != null) { - while (container.getContainer() != null) { - container = container.getContainer(); - } - GuiElement popup = Iterables.getLast(container.getChildren()); - if (popup instanceof AbstractGuiPopup) { - return (AbstractGuiPopup) popup; - } - } - return null; - } - - public void expectGui(Class guiClass, Consumer onOpen) { - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - class EventHandler { - net.minecraft.client.gui.GuiScreen currentScreen; - int framesPassed; - - @SubscribeEvent - public void onGuiOpen(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.START) return; - if (currentScreen != mc.currentScreen) { - currentScreen = mc.currentScreen; - framesPassed = 0; - } - if (framesPassed < 10) { - framesPassed++; - return; - } - - MinecraftForge.EVENT_BUS.unregister(this); - - Object foundGui = null; - if (AbstractGuiScreen.class.isAssignableFrom(guiClass)) { - AbstractGuiScreen guiScreen = GuiScreen.from(currentScreen); - if (guiClass.isInstance(guiScreen)) { - onOpen.consume(guiClass.cast(guiScreen)); - return; - } - foundGui = guiScreen; - } else if (AbstractGuiOverlay.class.isAssignableFrom(guiClass)) { - AbstractGuiOverlay guiScreen = GuiOverlay.from(currentScreen); - if (guiClass.isInstance(guiScreen)) { - onOpen.consume(guiClass.cast(guiScreen)); - return; - } - foundGui = guiScreen; - } else if (AbstractGuiPopup.class.isAssignableFrom(guiClass)) { - AbstractGuiPopup popup = getPopup(currentScreen); - if (guiClass.isInstance(popup)) { - onOpen.consume(guiClass.cast(popup)); - return; - } - } else { - if (guiClass.isInstance(currentScreen)) { - onOpen.consume(guiClass.cast(currentScreen)); - return; - } - } - class UnexpectedGuiException extends Exception { - UnexpectedGuiException(Object foundGui) { - super("Expected instance of " + guiClass + " but found " + foundGui); - setStackTrace(Arrays.copyOfRange(stackTrace, 2, stackTrace.length)); - } - } - future.setException(new UnexpectedGuiException(foundGui == null ? currentScreen : foundGui)); - } - } - MinecraftForge.EVENT_BUS.register(new EventHandler()); - } - - private void clickNow(int x, int y) { - try { - Method method = net.minecraft.client.gui.GuiScreen.class - .getDeclaredMethod("mouseClicked", int.class, int.class, int.class); - method.setAccessible(true); - method.invoke(mc.currentScreen, x, y, 0); - } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - future.setException(e); - } - } - - public void click(int x, int y) { - runLater(() -> { - LOGGER.info("Clicking at {}/{}", x, y); - clickNow(x, y); - }); - } - - private void dragNow(int x, int y) { - try { - Method method = net.minecraft.client.gui.GuiScreen.class - .getDeclaredMethod("mouseClickMove", int.class, int.class, int.class, long.class); - method.setAccessible(true); - method.invoke(mc.currentScreen, x, y, 0, 0); - } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - future.setException(e); - } - } - - public void drag(int x, int y) { - runLater(() -> { - LOGGER.info("Dragging to {}/{}", x, y); - dragNow(x, y); - }); - } - - public void click(GuiButton button) { - runLater(() -> { - if (!button.isEnabled()) { - future.setException(new IllegalStateException("Button is disabled: " + button.getLabel())); - return; - } - LOGGER.info("Clicking button {}", button.getLabel()); - button.onClick(); - }); - } - - public void click(GuiTexturedButton button) { - runLater(() -> { - if (!button.isEnabled()) { - future.setException(new IllegalStateException("Button is disabled: " + button.getTexture())); - return; - } - LOGGER.info("Clicking textured button {}", button.getTexture()); - button.onClick(); - }); - } - - public void click(String buttonText) { - runLater(() -> { - LOGGER.info("Clicking button {}", buttonText); - try { - Field field = net.minecraft.client.gui.GuiScreen.class.getDeclaredField("buttonList"); - field.setAccessible(true); - @SuppressWarnings("unchecked") - List buttonList = (List) - field.get(mc.currentScreen); - - net.minecraft.client.gui.GuiButton button = null; - for (net.minecraft.client.gui.GuiButton guiButton : buttonList) { - if (guiButton.displayString.equals(buttonText)) { - button = guiButton; - } - } - if (button == null) { - future.setException(new NoSuchElementException("No button with label: " + buttonText)); - return; - } - - clickNow(button.x + 5, button.y + 5); - } catch (IllegalAccessException | NoSuchFieldException e) { - future.setException(e); - } - }); - } - - public void type(String string) { - for (char c : string.toCharArray()) { - press(c, Keyboard.getKeyIndex(String.valueOf(c).toUpperCase())); - } - } - - public void press(int keyCode) { - String keyName = Keyboard.getKeyName(keyCode); - char character = keyName.length() == 1 ? keyName.charAt(0) : '\0'; - press(character, keyCode); - } - - public void press(char character, int keyCode) { - runLater(() -> { - LOGGER.info("Pressing key {}", Keyboard.getKeyName(keyCode)); - if (mc.currentScreen == null || mc.currentScreen.allowUserInput) { - KeyBinding.onTick(keyCode); - FMLCommonHandler.instance().fireKeyInput(); - } - if (mc.currentScreen != null) { - try { - Method method = net.minecraft.client.gui.GuiScreen.class - .getDeclaredMethod("keyTyped", char.class, int.class); - method.setAccessible(true); - method.invoke(mc.currentScreen, character, keyCode); - } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - future.setException(e); - } - } - }); - } -} diff --git a/src/integration-test/java/com/replaymod/core/CompositeTask.java b/src/integration-test/java/com/replaymod/core/CompositeTask.java deleted file mode 100644 index deeb2529..00000000 --- a/src/integration-test/java/com/replaymod/core/CompositeTask.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.replaymod.core; - -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.SettableFuture; - -import static com.replaymod.core.ReplayModIntegrationTest.LOGGER; -import static com.replaymod.core.utils.Utils.addCallback; - -public class CompositeTask implements Task { - private SettableFuture future; - protected final Task[] children; - - public CompositeTask(Task[] children) { - this.children = children; - } - - @Override - public ListenableFuture execute() { - future = SettableFuture.create(); - executeChild(0); - return future; - } - - private void executeChild(int childIndex) { - if (future.isDone()) return; - if (childIndex < children.length) { - ReplayMod.instance.runLater(() -> { - try { - Task task = children[childIndex]; - LOGGER.info("Running task {}", task); - ListenableFuture childFuture = task.execute(); - addCallback(childFuture, done -> executeChild(childIndex + 1), err -> future.setException(err)); - } catch (Throwable t) { - future.setException(t); - } - }); - } else { - future.set(null); - } - } -} diff --git a/src/integration-test/java/com/replaymod/core/ReplayModIntegrationTest.java b/src/integration-test/java/com/replaymod/core/ReplayModIntegrationTest.java deleted file mode 100644 index 3733e302..00000000 --- a/src/integration-test/java/com/replaymod/core/ReplayModIntegrationTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.replaymod.core; - -import com.replaymod.core.regression.RegressionTest60; -import com.replaymod.core.regression.RegressionTest61; -import com.replaymod.core.regression.RegressionTest62; -import com.replaymod.extra.DownloadOpenEye; -import com.replaymod.online.SkipLogin; -import com.replaymod.recording.CreateSPWorld; -import com.replaymod.recording.ExitSPWorld; -import com.replaymod.replay.ExitReplay; -import com.replaymod.replay.LoadReplay; -import com.replaymod.replay.OpenReplayViewer; -import net.minecraft.client.Minecraft; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import org.apache.logging.log4j.Logger; - -import static com.replaymod.core.AbstractTask.mc; -import static com.replaymod.core.ReplayModIntegrationTest.MOD_ID; -import static com.replaymod.core.utils.Utils.addCallback; - -/** - * Helper mod that initiates the integration tests. - */ -@Mod(modid = MOD_ID) -public class ReplayModIntegrationTest { - public static final String MOD_ID = "replaymod-integration-test"; - - public static Logger LOGGER; - - @Mod.EventHandler - public void init(FMLPreInitializationEvent event) { - LOGGER = event.getModLog(); - - // Make sure the game window doesn't have to remain in focus during the test - mc.gameSettings.pauseOnLostFocus = false; - - // Vanilla uses our keys - mc.gameSettings.keyBindAdvancements.setKeyCode(0); - mc.gameSettings.keyBindLoadToolbar.setKeyCode(0); - mc.gameSettings.keyBindSaveToolbar.setKeyCode(0); - - runTasks( - new SkipLogin(), - new DownloadOpenEye(), - new CreateSPWorld(), - new Wait(5000), - new ExitSPWorld(), - new OpenReplayViewer(), - new LoadReplay(), - - new RegressionTest60(), - new RegressionTest61(), - new RegressionTest62(), - - // new AbstractTask() {}, // Uncomment to not exit on success (useful for writing more tests) - new ExitReplay() - ); - } - - private void runTasks(Task... tests) { - addCallback(new CompositeTask(tests).execute(), success -> { - if (!Minecraft.getMinecraft().hasCrashed) { - LOGGER.info("==================================================="); - LOGGER.info("= ALL TESTS PASSED ="); - LOGGER.info("==================================================="); - FMLCommonHandler.instance().exitJava(0, false); - } - }, error -> { - LOGGER.error("Failed task:", error); - LOGGER.error("==================================================="); - LOGGER.error("= TEST FAILED ="); - LOGGER.error("==================================================="); - FMLCommonHandler.instance().exitJava(1, false); - }); - } -} diff --git a/src/integration-test/java/com/replaymod/core/Task.java b/src/integration-test/java/com/replaymod/core/Task.java deleted file mode 100644 index 4db75a0e..00000000 --- a/src/integration-test/java/com/replaymod/core/Task.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.replaymod.core; - -import com.google.common.util.concurrent.ListenableFuture; - -public interface Task { - ListenableFuture execute(); - - static Task click(int x, int y) { - return AbstractTask.create(task -> { - task.click(x, y); - task.runLater(() -> task.future.set(null)); - }); - } - - static Task drag(int x, int y) { - return AbstractTask.create(task -> { - task.drag(x, y); - task.runLater(() -> task.future.set(null)); - }); - } - - static Task pressKey(int keyCode) { - return AbstractTask.create(task -> { - task.press(keyCode); - task.runLater(() -> task.future.set(null)); - }); - } - - static Task pressKey(char character, int keyCode) { - return AbstractTask.create(task -> { - task.press(character, keyCode); - task.runLater(() -> task.future.set(null)); - }); - } -} diff --git a/src/integration-test/java/com/replaymod/core/Utils.java b/src/integration-test/java/com/replaymod/core/Utils.java deleted file mode 100644 index 61d41497..00000000 --- a/src/integration-test/java/com/replaymod/core/Utils.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.replaymod.core; - -public class Utils { - public static void times(int x, Runnable runnable) { - for (int i = 0; i < x; i++) { - runnable.run(); - } - } -} diff --git a/src/integration-test/java/com/replaymod/core/Wait.java b/src/integration-test/java/com/replaymod/core/Wait.java deleted file mode 100644 index b528889d..00000000 --- a/src/integration-test/java/com/replaymod/core/Wait.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.replaymod.core; - -public class Wait extends AbstractTask { - private final int duration; - - public Wait(int duration) { - this.duration = duration; - } - - @Override - protected void init() { - new Thread(() -> { - try { - Thread.sleep(duration); - runLater(() -> future.set(null)); - } catch (InterruptedException e) { - runLater(() -> future.setException(e)); - } - }).start(); - } -} diff --git a/src/integration-test/java/com/replaymod/core/regression/RegressionTest60.java b/src/integration-test/java/com/replaymod/core/regression/RegressionTest60.java deleted file mode 100644 index 72603462..00000000 --- a/src/integration-test/java/com/replaymod/core/regression/RegressionTest60.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.replaymod.core.regression; - -import com.replaymod.core.AbstractTask; -import com.replaymod.core.CompositeTask; -import com.replaymod.core.Task; -import com.replaymod.replay.SpectatePlayer; -import com.replaymod.replay.overlay.OverlayGui; -import com.replaymod.simplepathing.GuiPathingTasks; -import com.replaymod.simplepathing.gui.GuiEditKeyframe; -import org.lwjgl.input.Keyboard; - -import static com.replaymod.core.AbstractTask.mc; -import static com.replaymod.core.Utils.times; - -/** - * Regression test: #60 Crash in path preview when two spectator keyframes are closer than 50ms - */ -public class RegressionTest60 extends CompositeTask { - public RegressionTest60() { - super(new Task[]{ - new SpectatePlayer(), - OverlayGui.whileOpened( - // Place first spectator keyframe - new GuiPathingTasks.ClickPositionKeyframeButton(), - // Place second spectator keyframe - Task.click(130, 50), - new GuiPathingTasks.ClickPositionKeyframeButton(), - // Move second keyframe to 20ms on the keyframe timeline - AbstractTask.create(task -> { - // Double click keyframe - task.click(130, 50); - task.click(130, 50); - task.expectGui(GuiEditKeyframe.Spectator.class, gui -> { - // Set ms field to 20 - task.click(mc.currentScreen.width / 2 + 80, mc.currentScreen.height / 2); - times(4, () -> task.press(Keyboard.KEY_BACK)); - task.type("20"); - // Set other fields to 0 - times(2, () -> { - task.press(Keyboard.KEY_TAB); - times(4, () -> task.press(Keyboard.KEY_BACK)); - task.press(Keyboard.KEY_0); - }); - task.click(gui.saveButton); - task.expectPopupClosed(() -> task.future.set(null)); - }); - }), - // Place second spectator keyframe - new GuiPathingTasks.ClickPositionKeyframeButton() - ), - // Stop spectating player - new SpectatePlayer.End(), - // Enable path preview - Task.pressKey(Keyboard.KEY_H), - new GuiPathingTasks.ClearKeyframeTimeline(), - Task.pressKey(Keyboard.KEY_H), - }); - } -} diff --git a/src/integration-test/java/com/replaymod/core/regression/RegressionTest61.java b/src/integration-test/java/com/replaymod/core/regression/RegressionTest61.java deleted file mode 100644 index 5b5b4951..00000000 --- a/src/integration-test/java/com/replaymod/core/regression/RegressionTest61.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.replaymod.core.regression; - -import com.replaymod.core.AbstractTask; -import com.replaymod.core.CompositeTask; -import com.replaymod.core.Task; -import com.replaymod.replay.overlay.OverlayGui; -import com.replaymod.simplepathing.GuiPathingTasks; -import com.replaymod.simplepathing.gui.GuiEditKeyframe; - -/** - * Regression test: #61 NPE when saving in edit keyframe gui of last keyframe - */ -public class RegressionTest61 extends CompositeTask { - public RegressionTest61() { - super(new Task[]{ - OverlayGui.whileOpened( - // Place keyframe - Task.click(130, 50), - new GuiPathingTasks.ClickPositionKeyframeButton(), - AbstractTask.create(task -> { - // Double click keyframe - task.click(130, 50); - task.click(130, 50); - task.expectGui(GuiEditKeyframe.Position.class, gui -> { - task.click(gui.saveButton); - task.expectPopupClosed(() -> task.future.set(null)); - }); - }), - // Place second spectator keyframe - new GuiPathingTasks.ClickPositionKeyframeButton() - ), - new GuiPathingTasks.ClearKeyframeTimeline(), - }); - } -} diff --git a/src/integration-test/java/com/replaymod/core/regression/RegressionTest62.java b/src/integration-test/java/com/replaymod/core/regression/RegressionTest62.java deleted file mode 100644 index ebfa44a3..00000000 --- a/src/integration-test/java/com/replaymod/core/regression/RegressionTest62.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.replaymod.core.regression; - -import com.replaymod.core.CompositeTask; -import com.replaymod.core.Task; -import com.replaymod.replay.overlay.OverlayGui; -import com.replaymod.simplepathing.GuiPathingTasks; - -/** - * Regression test: #62 Swapping the only two existing keyframes causes NPE - */ -public class RegressionTest62 extends CompositeTask { - public RegressionTest62() { - super(new Task[]{ - OverlayGui.whileOpened( - // Place first keyframe - Task.click(130, 50), - new GuiPathingTasks.ClickPositionKeyframeButton(), - // Place second keyframe - Task.click(150, 50), - new GuiPathingTasks.ClickPositionKeyframeButton(), - // Move first keyframe past second keyframe - Task.click(130,50), - Task.drag(170,50) - ), - new GuiPathingTasks.ClearKeyframeTimeline() - }); - } -} diff --git a/src/integration-test/java/com/replaymod/extra/DownloadOpenEye.java b/src/integration-test/java/com/replaymod/extra/DownloadOpenEye.java deleted file mode 100644 index 257a56fd..00000000 --- a/src/integration-test/java/com/replaymod/extra/DownloadOpenEye.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.replaymod.extra; - -import com.replaymod.core.AbstractTask; -import com.replaymod.extras.OpenEyeExtra; -import net.minecraftforge.fml.common.Loader; - -import java.io.File; -import java.nio.file.NoSuchFileException; - -public class DownloadOpenEye extends AbstractTask { - @Override - protected void init() { - if ("1".equals(System.getenv("RM_INTEGRATION_TEST_NO_OPENEYE"))) { - runLater(() -> future.set(null)); - return; - } - expectGui(OpenEyeExtra.OfferGui.class, offerGui -> { - click(offerGui.yesButton); - expectGuiClosed(20 * 1000, () -> { - File targetFile = new File(mc.mcDataDir, "mods/" + Loader.MC_VERSION + "/OpenEye.jar"); - if (!targetFile.exists()) { - future.setException(new NoSuchFileException(targetFile.getAbsolutePath())); - } else { - future.set(null); - } - }); - }); - } -} diff --git a/src/integration-test/java/com/replaymod/online/SkipLogin.java b/src/integration-test/java/com/replaymod/online/SkipLogin.java deleted file mode 100644 index 733b6543..00000000 --- a/src/integration-test/java/com/replaymod/online/SkipLogin.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.replaymod.online; - -import com.replaymod.core.AbstractTask; -import com.replaymod.online.gui.GuiLoginPrompt; - -public class SkipLogin extends AbstractTask { - @Override - protected void init() { - expectGui(GuiLoginPrompt.class, gui -> { - click(gui.cancelButton); - expectGuiClosed(() -> future.set(null)); - }); - } -} diff --git a/src/integration-test/java/com/replaymod/recording/CreateSPWorld.java b/src/integration-test/java/com/replaymod/recording/CreateSPWorld.java deleted file mode 100644 index a6a4e684..00000000 --- a/src/integration-test/java/com/replaymod/recording/CreateSPWorld.java +++ /dev/null @@ -1,32 +0,0 @@ -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.GuiWorldSelection; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -public class CreateSPWorld extends AbstractTask { - @Override - protected void init() { - expectGui(GuiMainMenu.class, mainMenu -> { - click("Singleplayer"); - expectGui(GuiWorldSelection.class, selectWorld -> { - click("Create New World"); - expectGui(GuiCreateWorld.class, createWorld -> { - click("Create New World"); - class EventHandler { - @SubscribeEvent - public void onRenderIngame(RenderGameOverlayEvent.Pre event) { - MinecraftForge.EVENT_BUS.unregister(this); - runLater(() -> future.set(null)); - } - } - MinecraftForge.EVENT_BUS.register(new EventHandler()); - }); - }); - }); - } -} diff --git a/src/integration-test/java/com/replaymod/recording/ExitSPWorld.java b/src/integration-test/java/com/replaymod/recording/ExitSPWorld.java deleted file mode 100644 index b531a275..00000000 --- a/src/integration-test/java/com/replaymod/recording/ExitSPWorld.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.replaymod.recording; - -import com.replaymod.core.AbstractTask; -import net.minecraft.client.gui.GuiIngameMenu; -import net.minecraft.client.gui.GuiMainMenu; -import org.apache.commons.io.filefilter.DirectoryFileFilter; - -import java.io.IOException; - -public class ExitSPWorld extends AbstractTask { - @Override - protected void init() { - mc.displayInGameMenu(); - expectGui(GuiIngameMenu.class, ingameMenu -> { - click("Save and Quit to Title"); - expectGui(GuiMainMenu.class, mainMenu -> new Thread(() -> { - try { - while (true) { - String[] dirs = core.getReplayFolder().list(DirectoryFileFilter.DIRECTORY); - if (dirs == null) { - future.setException(new NullPointerException("dirs is null")); - return; - } - if (dirs.length == 0) { - runLater(() -> future.set(null)); - return; - } - Thread.sleep(10); - } - } catch (IOException | InterruptedException e) { - future.setException(e); - } - }).start()); - }); - } -} diff --git a/src/integration-test/java/com/replaymod/replay/ExitReplay.java b/src/integration-test/java/com/replaymod/replay/ExitReplay.java deleted file mode 100644 index 5989e0ef..00000000 --- a/src/integration-test/java/com/replaymod/replay/ExitReplay.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.replaymod.replay; - -import com.replaymod.core.AbstractTask; -import net.minecraft.client.gui.GuiIngameMenu; -import net.minecraft.client.gui.GuiMainMenu; - -public class ExitReplay extends AbstractTask { - @Override - protected void init() { - mc.displayInGameMenu(); - expectGui(GuiIngameMenu.class, ingameMenu -> { - click("Exit Replay"); - expectGui(GuiMainMenu.class, mainMenu -> future.set(null)); - }); - } -} diff --git a/src/integration-test/java/com/replaymod/replay/LoadReplay.java b/src/integration-test/java/com/replaymod/replay/LoadReplay.java deleted file mode 100644 index 2db6383b..00000000 --- a/src/integration-test/java/com/replaymod/replay/LoadReplay.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.replaymod.replay; - -import com.replaymod.core.AbstractTask; -import com.replaymod.replay.gui.screen.GuiReplayViewer; -import de.johni0702.minecraft.gui.function.Clickable; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.lwjgl.util.Point; -import org.lwjgl.util.ReadableDimension; - -public class LoadReplay extends AbstractTask { - @Override - protected void init() { - expectGui(GuiReplayViewer.class, replayViewer -> runLater(() -> { - ReadableDimension size = replayViewer.getMaxSize(); - // Select first entry - replayViewer.forEach(Clickable.class).mouseClick(new Point(size.getWidth() / 2, 40), 0); - // Load first replay - click(replayViewer.loadButton); - - class EventHandler { - @SubscribeEvent - public void onRenderIngame(RenderGameOverlayEvent.Pre event) { - MinecraftForge.EVENT_BUS.unregister(this); - runLater(() -> future.set(null)); - } - } - MinecraftForge.EVENT_BUS.register(new EventHandler()); - })); - } -} diff --git a/src/integration-test/java/com/replaymod/replay/OpenReplayViewer.java b/src/integration-test/java/com/replaymod/replay/OpenReplayViewer.java deleted file mode 100644 index fb0e5b50..00000000 --- a/src/integration-test/java/com/replaymod/replay/OpenReplayViewer.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.replaymod.replay; - -import com.replaymod.core.AbstractTask; -import com.replaymod.replay.gui.screen.GuiReplayViewer; -import net.minecraft.client.gui.GuiMainMenu; - -public class OpenReplayViewer extends AbstractTask { - @Override - protected void init() { - expectGui(GuiMainMenu.class, mainMenu -> { - click("Replay Viewer"); - expectGui(GuiReplayViewer.class, replayViewer -> future.set(null)); - }); - } -} diff --git a/src/integration-test/java/com/replaymod/replay/SpectatePlayer.java b/src/integration-test/java/com/replaymod/replay/SpectatePlayer.java deleted file mode 100644 index c248333b..00000000 --- a/src/integration-test/java/com/replaymod/replay/SpectatePlayer.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.replaymod.replay; - -import com.replaymod.core.AbstractTask; -import com.replaymod.extras.playeroverview.PlayerOverviewGui; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.lwjgl.input.Keyboard; - -import java.util.concurrent.TimeoutException; - -public class SpectatePlayer extends AbstractTask { - @Override - protected void init() { - press(Keyboard.KEY_B); - expectGui(PlayerOverviewGui.class, overview -> { - click(overview.getMaxSize().getWidth() / 2 - 60, 60); - press(Keyboard.KEY_ESCAPE); - expectGuiClosed(() -> future.set(null)); - }); - } - - public static class End extends AbstractTask { - private int timeout; - - @Override - protected void init() { - runLater(() -> press(Keyboard.KEY_LSHIFT)); - } - - @SubscribeEvent - public void onTick(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.START) return; - if (timeout++ > 20) { - future.setException(new TimeoutException("Camera hasn't stopped spectating.")); - return; - } - if (mc.getRenderViewEntity() == mc.player) { - future.set(null); - } - } - } -} diff --git a/src/integration-test/java/com/replaymod/replay/overlay/OverlayGui.java b/src/integration-test/java/com/replaymod/replay/overlay/OverlayGui.java deleted file mode 100644 index 9e261082..00000000 --- a/src/integration-test/java/com/replaymod/replay/overlay/OverlayGui.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.replaymod.replay.overlay; - -import com.replaymod.core.AbstractTask; -import com.replaymod.core.CompositeTask; -import com.replaymod.core.Task; -import com.replaymod.replay.gui.overlay.GuiReplayOverlay; -import org.lwjgl.input.Keyboard; - -public class OverlayGui { - public static Task whileOpened(Task...tasks) { - Task[] nTasks = new Task[tasks.length + 2]; - System.arraycopy(tasks, 0, nTasks, 1, tasks.length); - nTasks[0] = new Open(); - nTasks[tasks.length + 1] = new Close(); - return new CompositeTask(nTasks); - } - - public static class Open extends AbstractTask { - @Override - protected void init() { - press(Keyboard.KEY_T); - expectGui(GuiReplayOverlay.class, done -> future.set(null)); - } - } - - public static class Close extends AbstractTask { - @Override - protected void init() { - press(Keyboard.KEY_ESCAPE); - expectGuiClosed(() -> future.set(null)); - } - } -} diff --git a/src/integration-test/java/com/replaymod/simplepathing/GuiPathingTasks.java b/src/integration-test/java/com/replaymod/simplepathing/GuiPathingTasks.java deleted file mode 100644 index 2e88ac6b..00000000 --- a/src/integration-test/java/com/replaymod/simplepathing/GuiPathingTasks.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.replaymod.simplepathing; - -import com.replaymod.core.AbstractTask; -import com.replaymod.replay.gui.overlay.GuiReplayOverlay; -import com.replaymod.simplepathing.gui.GuiPathing; -import de.johni0702.minecraft.gui.popup.GuiYesNoPopup; -import org.lwjgl.input.Keyboard; - -public abstract class GuiPathingTasks extends AbstractTask { - @Override - protected void init() { - expectGui(GuiReplayOverlay.class, ign -> init0(ReplayModSimplePathing.instance.getGuiPathing())); - } - - protected abstract void init0(GuiPathing guiPathing); - - public static class ClickPositionKeyframeButton extends GuiPathingTasks { - @Override - protected void init0(GuiPathing guiPathing) { - click(guiPathing.positionKeyframeButton); - runLater(() -> future.set(null)); - } - } - - public static class ClearKeyframeTimeline extends AbstractTask { - @Override - protected void init() { - press(Keyboard.KEY_C); - expectGui(GuiYesNoPopup.class, popup -> { - click(popup.getYesButton()); - expectGuiClosed(() -> future.set(null)); - }); - } - } -} diff --git a/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java b/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java index fe25d172..6943abf3 100644 --- a/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java +++ b/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java @@ -3,11 +3,11 @@ import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.core.versions.MCVer; import com.replaymod.render.events.ReplayRenderCallback; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; public class DisableFastRender extends EventRegistrations { - private final MinecraftClient mc = MinecraftClient.getInstance(); + private final Minecraft mc = Minecraft.getInstance(); private boolean wasFastRender = false; @@ -16,8 +16,8 @@ private void onRenderBegin() { if (!MCVer.hasOptifine()) return; try { - wasFastRender = (boolean) OptifineReflection.gameSettings_ofFastRender.get(mc.options); - OptifineReflection.gameSettings_ofFastRender.set(mc.options, false); + wasFastRender = (boolean) OptifineReflection.gameSettings_ofFastRender.get(mc.gameSettings); + OptifineReflection.gameSettings_ofFastRender.set(mc.gameSettings, false); } catch (IllegalAccessException e) { e.printStackTrace(); } @@ -28,7 +28,7 @@ private void onRenderEnd() { if (!MCVer.hasOptifine()) return; try { - OptifineReflection.gameSettings_ofFastRender.set(mc.options, wasFastRender); + OptifineReflection.gameSettings_ofFastRender.set(mc.gameSettings, wasFastRender); } catch (IllegalAccessException e) { e.printStackTrace(); } diff --git a/src/main/java/com/replaymod/compat/optifine/OptifineReflection.java b/src/main/java/com/replaymod/compat/optifine/OptifineReflection.java index d93419d5..58abfc7b 100644 --- a/src/main/java/com/replaymod/compat/optifine/OptifineReflection.java +++ b/src/main/java/com/replaymod/compat/optifine/OptifineReflection.java @@ -1,6 +1,6 @@ package com.replaymod.compat.optifine; -import net.minecraft.client.options.GameOptions; +import net.minecraft.client.GameSettings; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -15,7 +15,7 @@ public class OptifineReflection { // this throws an ignored ClassNotFoundException if Optifine isn't installed Class.forName("Config"); - gameSettings_ofFastRender = GameOptions.class.getDeclaredField("ofFastRender"); + gameSettings_ofFastRender = GameSettings.class.getDeclaredField("ofFastRender"); gameSettings_ofFastRender.setAccessible(true); } catch (ClassNotFoundException ignore) { // no optifine installed diff --git a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java index 1ee0d502..fd88ac10 100644 --- a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java +++ b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java @@ -4,13 +4,13 @@ import com.replaymod.core.events.PreRenderCallback; import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.gui.utils.EventRegistrations; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import java.lang.reflect.InvocationTargetException; public class ShaderBeginRender extends EventRegistrations { - private final MinecraftClient mc = MinecraftClient.getInstance(); + private final Minecraft mc = Minecraft.getInstance(); /** * Invokes Shaders#beginRender when rendering a video, @@ -32,9 +32,9 @@ private void onRenderTickStart() { ShaderReflection.shaders_beginRender.invoke(null, mc, //#if MC>=11400 - mc.gameRenderer.getCamera(), + mc.gameRenderer.getActiveRenderInfo(), //#endif - mc.getTickDelta(), 0); + mc.getRenderPartialTicks(), 0); } catch (IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } diff --git a/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java b/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java index d4aa860a..e71b2035 100644 --- a/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java +++ b/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java @@ -1,10 +1,10 @@ //#if MC>=10800 package com.replaymod.compat.shaders; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; //#if MC>=11400 -import net.minecraft.client.render.Camera; +import net.minecraft.client.renderer.ActiveRenderInfo; //#endif import java.lang.reflect.Field; @@ -41,9 +41,9 @@ public class ShaderReflection { shaders_isShadowPass = shadersClass.getDeclaredField("isShadowPass"); shaders_isShadowPass.setAccessible(true); - shaders_beginRender = shadersClass.getDeclaredMethod("beginRender", MinecraftClient.class, + shaders_beginRender = shadersClass.getDeclaredMethod("beginRender", Minecraft.class, //#if MC>=11400 - Camera.class, + ActiveRenderInfo.class, //#endif float.class, long.class); shaders_beginRender.setAccessible(true); diff --git a/src/main/java/com/replaymod/core/DummyChainLoadEntryPoint.java b/src/main/java/com/replaymod/core/DummyChainLoadEntryPoint.java index 3917859d..11f7edc2 100644 --- a/src/main/java/com/replaymod/core/DummyChainLoadEntryPoint.java +++ b/src/main/java/com/replaymod/core/DummyChainLoadEntryPoint.java @@ -1,18 +1,18 @@ //#if FABRIC>=1 -package com.replaymod.core; - -import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; - -// Required for ReplayModMMLauncher. -// -// Chain-loading mixin configurations only works when the first class that is loaded doesn't have any mixins which -// target it. The first class would ordinarily be MC's Main but there are valid use cases for targeting it, see -// e.g. https://github.com/ReplayMod/ReplayMod/issues/327 -// So, instead of relying on the bad assumption that Main doesn't have any mixins, we'll instead register this -// dummy pre-launch entry point which is practically guaranteed to not have any mixins and gets called before Main. -public class DummyChainLoadEntryPoint implements PreLaunchEntrypoint { - @Override - public void onPreLaunch() { - } -} +//$$ package com.replaymod.core; +//$$ +//$$ import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; +//$$ +//$$ // Required for ReplayModMMLauncher. +//$$ // +//$$ // Chain-loading mixin configurations only works when the first class that is loaded doesn't have any mixins which +//$$ // target it. The first class would ordinarily be MC's Main but there are valid use cases for targeting it, see +//$$ // e.g. https://github.com/ReplayMod/ReplayMod/issues/327 +//$$ // So, instead of relying on the bad assumption that Main doesn't have any mixins, we'll instead register this +//$$ // dummy pre-launch entry point which is practically guaranteed to not have any mixins and gets called before Main. +//$$ public class DummyChainLoadEntryPoint implements PreLaunchEntrypoint { +//$$ @Override +//$$ public void onPreLaunch() { +//$$ } +//$$ } //#endif diff --git a/src/main/java/com/replaymod/core/KeyBindingRegistry.java b/src/main/java/com/replaymod/core/KeyBindingRegistry.java index fc2ee64c..4ff3cd1b 100644 --- a/src/main/java/com/replaymod/core/KeyBindingRegistry.java +++ b/src/main/java/com/replaymod/core/KeyBindingRegistry.java @@ -7,19 +7,19 @@ import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.core.events.KeyBindingEventCallback; import com.replaymod.core.events.KeyEventCallback; -import net.minecraft.client.options.KeyBinding; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; +import net.minecraft.crash.ReportedException; //#if FABRIC>=1 -import com.replaymod.core.versions.LangResourcePack; -import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; -import net.minecraft.client.util.InputUtil; -import net.minecraft.util.Identifier; -import static com.replaymod.core.ReplayMod.MOD_ID; +//$$ import com.replaymod.core.versions.LangResourcePack; +//$$ import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; +//$$ import net.minecraft.client.util.InputUtil; +//$$ import net.minecraft.util.Identifier; +//$$ import static com.replaymod.core.ReplayMod.MOD_ID; //#else -//$$ import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.client.registry.ClientRegistry; //#endif import java.util.ArrayList; @@ -36,7 +36,7 @@ public class KeyBindingRegistry extends EventRegistrations { private static final String CATEGORY = "replaymod.title"; //#if FABRIC>=1 - static { net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.addCategory(CATEGORY); } + //$$ static { net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.addCategory(CATEGORY); } //#endif private final Map bindings = new HashMap<>(); @@ -59,16 +59,16 @@ private Binding registerKeyBinding(String name, int keyCode, boolean onlyInRepay Binding binding = bindings.get(name); if (binding == null) { //#if FABRIC>=1 - if (keyCode == 0) { - keyCode = -1; - } - Identifier id = new Identifier(MOD_ID, name.substring(LangResourcePack.LEGACY_KEY_PREFIX.length())); - FabricKeyBinding fabricKeyBinding = FabricKeyBinding.Builder.create(id, InputUtil.Type.KEYSYM, keyCode, CATEGORY).build(); - net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.register(fabricKeyBinding); - KeyBinding keyBinding = fabricKeyBinding; + //$$ if (keyCode == 0) { + //$$ keyCode = -1; + //$$ } + //$$ Identifier id = new Identifier(MOD_ID, name.substring(LangResourcePack.LEGACY_KEY_PREFIX.length())); + //$$ FabricKeyBinding fabricKeyBinding = FabricKeyBinding.Builder.create(id, InputUtil.Type.KEYSYM, keyCode, CATEGORY).build(); + //$$ net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.register(fabricKeyBinding); + //$$ KeyBinding keyBinding = fabricKeyBinding; //#else - //$$ KeyBinding keyBinding = new KeyBinding(name, keyCode, CATEGORY); - //$$ ClientRegistry.registerKeyBinding(keyBinding); + KeyBinding keyBinding = new KeyBinding(name, keyCode, CATEGORY); + ClientRegistry.registerKeyBinding(keyBinding); //#endif binding = new Binding(name, keyBinding); bindings.put(name, binding); @@ -97,7 +97,7 @@ public Set getOnlyInReplay() { public void handleRepeatedKeyBindings() { for (Binding binding : bindings.values()) { - if (binding.keyBinding.isPressed()) { + if (binding.keyBinding.isKeyDown()) { invokeKeyBindingHandlers(binding, binding.repeatedHandlers); } } @@ -106,7 +106,7 @@ public void handleRepeatedKeyBindings() { { on(KeyBindingEventCallback.EVENT, this::handleKeyBindings); } private void handleKeyBindings() { for (Binding binding : bindings.values()) { - while (binding.keyBinding.wasPressed()) { + while (binding.keyBinding.isPressed()) { invokeKeyBindingHandlers(binding, binding.handlers); invokeKeyBindingHandlers(binding, binding.repeatedHandlers); } @@ -118,11 +118,11 @@ private void invokeKeyBindingHandlers(Binding binding, Collection hand try { runnable.run(); } catch (Throwable cause) { - CrashReport crashReport = CrashReport.create(cause, "Handling Key Binding"); - CrashReportSection category = crashReport.addElement("Key Binding"); - category.add("Key Binding", () -> binding.name); - category.add("Handler", runnable::toString); - throw new CrashException(crashReport); + CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Key Binding"); + CrashReportCategory category = crashReport.makeCategory("Key Binding"); + category.addDetail("Key Binding", () -> binding.name); + category.addDetail("Handler", runnable::toString); + throw new ReportedException(crashReport); } } } @@ -136,11 +136,11 @@ private boolean handleRaw(int keyCode, int action) { return true; } } catch (Throwable cause) { - CrashReport crashReport = CrashReport.create(cause, "Handling Raw Key Binding"); - CrashReportSection category = crashReport.addElement("Key Binding"); - category.add("Key Code", () -> "" + keyCode); - category.add("Handler", handler::toString); - throw new CrashException(crashReport); + CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Raw Key Binding"); + CrashReportCategory category = crashReport.makeCategory("Key Binding"); + category.addDetail("Key Code", () -> "" + keyCode); + category.addDetail("Handler", handler::toString); + throw new ReportedException(crashReport); } } return false; @@ -161,7 +161,7 @@ public Binding(String name, KeyBinding keyBinding) { public String getBoundKey() { try { - return keyBinding.getBoundKeyLocalizedText().getString(); + return keyBinding.func_238171_j_().getString(); } catch (ArrayIndexOutOfBoundsException e) { // Apparently windows likes to press strange keys, see https://www.replaymod.com/forum/thread/55 return "Unknown"; @@ -170,7 +170,7 @@ public String getBoundKey() { public boolean isBound() { //#if MC>=11400 - return !keyBinding.isUnbound(); + return !keyBinding.isInvalid(); //#else //$$ return keyBinding.getKeyCode() != 0; //#endif diff --git a/src/main/java/com/replaymod/core/ReplayMod.java b/src/main/java/com/replaymod/core/ReplayMod.java index 49f59b70..10f53b05 100644 --- a/src/main/java/com/replaymod/core/ReplayMod.java +++ b/src/main/java/com/replaymod/core/ReplayMod.java @@ -20,15 +20,15 @@ import com.replaymod.replaystudio.util.I18n; import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.gui.container.GuiScreen; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.options.Option; -import net.minecraft.resource.DirectoryResourcePack; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Style; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; -import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.AbstractOption; +import net.minecraft.resources.FolderPack; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.ResourceLocation; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; @@ -53,11 +53,11 @@ public class ReplayMod implements Module, Scheduler { public static final String MOD_ID = "replaymod"; - public static final Identifier TEXTURE = new Identifier("replaymod", "replay_gui.png"); + public static final ResourceLocation TEXTURE = new ResourceLocation("replaymod", "replay_gui.png"); public static final int TEXTURE_SIZE = 256; - public static final Identifier LOGO_FAVICON = new Identifier("replaymod", "favicon_logo.png"); + public static final ResourceLocation LOGO_FAVICON = new ResourceLocation("replaymod", "favicon_logo.png"); - private static final MinecraftClient mc = MCVer.getMinecraft(); + private static final Minecraft mc = MCVer.getMinecraft(); private final ReplayModBackend backend; private final SchedulerImpl scheduler = new SchedulerImpl(); @@ -87,7 +87,7 @@ public class ReplayMod implements Module, Scheduler { public ReplayMod(ReplayModBackend backend) { this.backend = backend; - I18n.setI18n(net.minecraft.client.resource.language.I18n::translate); + I18n.setI18n(net.minecraft.client.resources.I18n::format); // Check Minecraft protocol version for compatibility if (!ProtocolVersion.isRegistered(MCVer.getProtocolVersion()) && !Boolean.parseBoolean(System.getProperty("replaymod.skipversioncheck", "false"))) { @@ -118,7 +118,7 @@ public SettingsRegistry getSettingsRegistry() { public Path getReplayFolder() throws IOException { String str = getSettingsRegistry().get(Setting.RECORDING_PATH); - return Files.createDirectories(getMinecraft().runDirectory.toPath().resolve(str)); + return Files.createDirectories(getMinecraft().gameDir.toPath().resolve(str)); } /** @@ -142,7 +142,7 @@ public Path getRecordingFolder() throws IOException { */ public Path getCacheFolder() throws IOException { String str = getSettingsRegistry().get(Setting.CACHE_PATH); - Path path = getMinecraft().runDirectory.toPath().resolve(str); + Path path = getMinecraft().gameDir.toPath().resolve(str); Files.createDirectories(path); try { Files.setAttribute(path, "dos:hidden", true); @@ -166,14 +166,14 @@ public Path getReplayPathForCache(Path cache) throws IOException { return replayFolder.resolve(relative); } - public static final DirectoryResourcePack jGuiResourcePack = createJGuiResourcePack(); + public static final FolderPack jGuiResourcePack = createJGuiResourcePack(); public static final String JGUI_RESOURCE_PACK_NAME = "replaymod_jgui"; - private static DirectoryResourcePack createJGuiResourcePack() { + private static FolderPack createJGuiResourcePack() { File folder = new File("../jGui/src/main/resources"); if (!folder.exists()) { return null; } - return new DirectoryResourcePack(folder) { + return new FolderPack(folder) { @Override //#if MC>=11400 public String getName() { @@ -184,9 +184,9 @@ public String getName() { } @Override - protected InputStream openFile(String resourceName) throws IOException { + protected InputStream getInputStream(String resourceName) throws IOException { try { - return super.openFile(resourceName); + return super.getInputStream(resourceName); } catch (IOException e) { if ("pack.mcmeta".equals(resourceName)) { //#if MC>=11400 @@ -224,7 +224,7 @@ public void initClient() { // 1.7.10 crashes when render distance > 16 //#if MC>=10800 if (!MCVer.hasOptifine()) { - Option.RENDER_DISTANCE.setMax(64f); + AbstractOption.RENDER_DISTANCE.setMaxValue(64f); } //#endif @@ -363,7 +363,7 @@ public boolean isModLoaded(String id) { return backend.isModLoaded(id); } - public MinecraftClient getMinecraft() { + public Minecraft getMinecraft() { return mc; } @@ -380,18 +380,18 @@ private void printToChat(boolean warning, String message, Object... args) { // Some nostalgia: "§8[§6Replay Mod§8]§r Your message goes here" //#if MC>=10904 //#if MC>=11600 - Style coloredDarkGray = Style.EMPTY.withColor(Formatting.DARK_GRAY); - Style coloredGold = Style.EMPTY.withColor(Formatting.GOLD); - Style alert = Style.EMPTY.withColor(warning ? Formatting.RED : Formatting.DARK_GREEN); + Style coloredDarkGray = Style.EMPTY.setFormatting(TextFormatting.DARK_GRAY); + Style coloredGold = Style.EMPTY.setFormatting(TextFormatting.GOLD); + Style alert = Style.EMPTY.setFormatting(warning ? TextFormatting.RED : TextFormatting.DARK_GREEN); //#else //$$ Style coloredDarkGray = new Style().setColor(Formatting.DARK_GRAY); //$$ Style coloredGold = new Style().setColor(Formatting.GOLD); //$$ Style alert = new Style().setColor(warning ? Formatting.RED : Formatting.DARK_GREEN); //#endif - Text text = new LiteralText("[").setStyle(coloredDarkGray) - .append(new TranslatableText("replaymod.title").setStyle(coloredGold)) - .append(new LiteralText("] ")) - .append(new TranslatableText(message, args).setStyle(alert)); + ITextComponent text = new StringTextComponent("[").setStyle(coloredDarkGray) + .appendSibling(new TranslationTextComponent("replaymod.title").setStyle(coloredGold)) + .appendSibling(new StringTextComponent("] ")) + .appendSibling(new TranslationTextComponent(message, args).setStyle(alert)); //#else //$$ ChatStyle coloredDarkGray = new ChatStyle().setColor(EnumChatFormatting.DARK_GRAY); //$$ ChatStyle coloredGold = new ChatStyle().setColor(EnumChatFormatting.GOLD); @@ -403,7 +403,7 @@ private void printToChat(boolean warning, String message, Object... args) { //#endif // Send message to chat GUI // The ingame GUI is initialized at startup, therefore this is possible before the client is connected - mc.inGameHud.getChatHud().addMessage(text); + mc.ingameGUI.getChatGUI().printChatMessage(text); } } diff --git a/src/main/java/com/replaymod/core/ReplayModBackend.java b/src/main/java/com/replaymod/core/ReplayModBackend.java index d6313852..43a32254 100644 --- a/src/main/java/com/replaymod/core/ReplayModBackend.java +++ b/src/main/java/com/replaymod/core/ReplayModBackend.java @@ -1,29 +1,56 @@ package com.replaymod.core; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.loader.api.FabricLoader; +import com.mojang.bridge.launcher.Launcher; +import com.replaymod.mixin.MinecraftAccessor; +import com.replaymod.core.versions.forge.EventsAdapter; +import com.replaymod.extras.modcore.ModCoreInstaller; +import net.minecraft.resources.IResourcePack; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.javafmlmod.FMLModContainer; +import org.spongepowered.asm.launch.MixinBootstrap; +import org.spongepowered.asm.mixin.MixinEnvironment; +import org.spongepowered.asm.mixin.Mixins; + +import java.util.List; import static com.replaymod.core.ReplayMod.MOD_ID; +import static com.replaymod.core.ReplayMod.jGuiResourcePack; +import static com.replaymod.core.versions.MCVer.getMinecraft; -public class ReplayModBackend implements ClientModInitializer { +@Mod(ReplayMod.MOD_ID) +public class ReplayModBackend { private final ReplayMod mod = new ReplayMod(this); + private final EventsAdapter eventsAdapter = new EventsAdapter(); + + // @Deprecated + // public static Configuration config; + + public ReplayModBackend() { + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::init); + } - @Override - public void onInitializeClient() { + public void init(FMLCommonSetupEvent event) { mod.initModules(); + eventsAdapter.register(); + // config = new Configuration(event.getSuggestedConfigurationFile()); + // config.load(); + // SettingsRegistry settingsRegistry = mod.getSettingsRegistry(); + // settingsRegistry.backend.setConfiguration(config); + // settingsRegistry.save(); // Save default values to disk } public String getVersion() { - return FabricLoader.getInstance().getModContainer(MOD_ID) - .orElseThrow(IllegalStateException::new) - .getMetadata().getVersion().toString(); + return "2.5.1"; } public String getMinecraftVersion() { - return mod.getMinecraft().getGame().getVersion().getName(); + return "1.16.4"; } public boolean isModLoaded(String id) { - return FabricLoader.getInstance().isModLoaded(id.toLowerCase()); + return ModList.get().isLoaded(id); } } diff --git a/src/main/java/com/replaymod/core/ReplayModMMLauncher.java b/src/main/java/com/replaymod/core/ReplayModMMLauncher.java index e8de4c90..bd9606a0 100644 --- a/src/main/java/com/replaymod/core/ReplayModMMLauncher.java +++ b/src/main/java/com/replaymod/core/ReplayModMMLauncher.java @@ -1,74 +1,74 @@ //#if FABRIC>=1 -package com.replaymod.core; - -import com.replaymod.extras.modcore.ModCoreInstaller; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import org.spongepowered.asm.mixin.Mixins; - -import java.io.File; -import java.util.Optional; - -// We need to wait for MM to call us, otherwise we might initialize our mixins before it calls optifabric which would -// result in OF classes not existing while our mixins get resolved. -public class ReplayModMMLauncher implements Runnable { - private static boolean ran; - - @Override - public void run() { - // If this is MM2, then we're currently getting called because of our entrypoint declaration. - // For backwards compatibility with MM1, we also declare our early_riser via custom metadata and MM2 supports - // that as well and will therefore call us twice. - if (ran) { - return; - } - ran = true; - - Mixins.addConfiguration("mixins.compat.mapwriter.replaymod.json"); - Mixins.addConfiguration("mixins.compat.shaders.replaymod.json"); - Mixins.addConfiguration("mixins.core.replaymod.json"); - Mixins.addConfiguration("mixins.extras.playeroverview.replaymod.json"); - Mixins.addConfiguration("mixins.recording.replaymod.json"); - Mixins.addConfiguration("mixins.render.blend.replaymod.json"); - Mixins.addConfiguration("mixins.render.replaymod.json"); - Mixins.addConfiguration("mixins.replay.replaymod.json"); - - try { - initModCore(); - } catch (Throwable t) { - System.err.println("ReplayMod caught error during ModCore init:"); - t.printStackTrace(); - } - } - - // Forge equivalent is in ReplayModTweaker - private void initModCore() { - if (System.getProperty("REPLAYMOD_SKIP_MODCORE", "false").equalsIgnoreCase("true")) { - System.out.println("ReplayMod not initializing ModCore because REPLAYMOD_SKIP_MODCORE is true."); - return; - } - - if (FabricLoader.getInstance().isDevelopmentEnvironment()) { - System.out.println("ReplayMod not initializing ModCore because we're in a development environment."); - return; - } - - File gameDir = FabricLoader.getInstance().getGameDirectory(); - - Optional minecraft = FabricLoader.getInstance().getModContainer("minecraft"); - if (!minecraft.isPresent()) { - System.err.println("ReplayMod could not determine Minecraft version, skipping ModCore."); - return; - } - String mcVer = minecraft.get().getMetadata().getVersion().getFriendlyString(); - - int result = ModCoreInstaller.initialize(gameDir, mcVer + "_fabric"); - if (result != -2) { // Don't even bother logging the result if there's no ModCore for this version. - System.out.println("ReplayMod ModCore init result: " + result); - } - if (ModCoreInstaller.isErrored()) { - System.err.println(ModCoreInstaller.getError()); - } - } -} +//$$ package com.replaymod.core; +//$$ +//$$ import com.replaymod.extras.modcore.ModCoreInstaller; +//$$ import net.fabricmc.loader.api.FabricLoader; +//$$ import net.fabricmc.loader.api.ModContainer; +//$$ import org.spongepowered.asm.mixin.Mixins; +//$$ +//$$ import java.io.File; +//$$ import java.util.Optional; +//$$ +//$$ // We need to wait for MM to call us, otherwise we might initialize our mixins before it calls optifabric which would +//$$ // result in OF classes not existing while our mixins get resolved. +//$$ public class ReplayModMMLauncher implements Runnable { +//$$ private static boolean ran; +//$$ +//$$ @Override +//$$ public void run() { +//$$ // If this is MM2, then we're currently getting called because of our entrypoint declaration. +//$$ // For backwards compatibility with MM1, we also declare our early_riser via custom metadata and MM2 supports +//$$ // that as well and will therefore call us twice. +//$$ if (ran) { +//$$ return; +//$$ } +//$$ ran = true; +//$$ +//$$ Mixins.addConfiguration("mixins.compat.mapwriter.replaymod.json"); +//$$ Mixins.addConfiguration("mixins.compat.shaders.replaymod.json"); +//$$ Mixins.addConfiguration("mixins.core.replaymod.json"); +//$$ Mixins.addConfiguration("mixins.extras.playeroverview.replaymod.json"); +//$$ Mixins.addConfiguration("mixins.recording.replaymod.json"); +//$$ Mixins.addConfiguration("mixins.render.blend.replaymod.json"); +//$$ Mixins.addConfiguration("mixins.render.replaymod.json"); +//$$ Mixins.addConfiguration("mixins.replay.replaymod.json"); +//$$ +//$$ try { +//$$ initModCore(); +//$$ } catch (Throwable t) { +//$$ System.err.println("ReplayMod caught error during ModCore init:"); +//$$ t.printStackTrace(); +//$$ } +//$$ } +//$$ +//$$ // Forge equivalent is in ReplayModTweaker +//$$ private void initModCore() { +//$$ if (System.getProperty("REPLAYMOD_SKIP_MODCORE", "false").equalsIgnoreCase("true")) { +//$$ System.out.println("ReplayMod not initializing ModCore because REPLAYMOD_SKIP_MODCORE is true."); +//$$ return; +//$$ } +//$$ +//$$ if (FabricLoader.getInstance().isDevelopmentEnvironment()) { +//$$ System.out.println("ReplayMod not initializing ModCore because we're in a development environment."); +//$$ return; +//$$ } +//$$ +//$$ File gameDir = FabricLoader.getInstance().getGameDirectory(); +//$$ +//$$ Optional minecraft = FabricLoader.getInstance().getModContainer("minecraft"); +//$$ if (!minecraft.isPresent()) { +//$$ System.err.println("ReplayMod could not determine Minecraft version, skipping ModCore."); +//$$ return; +//$$ } +//$$ String mcVer = minecraft.get().getMetadata().getVersion().getFriendlyString(); +//$$ +//$$ int result = ModCoreInstaller.initialize(gameDir, mcVer + "_fabric"); +//$$ if (result != -2) { // Don't even bother logging the result if there's no ModCore for this version. +//$$ System.out.println("ReplayMod ModCore init result: " + result); +//$$ } +//$$ if (ModCoreInstaller.isErrored()) { +//$$ System.err.println(ModCoreInstaller.getError()); +//$$ } +//$$ } +//$$ } //#endif diff --git a/src/main/java/com/replaymod/core/ReplayModNonMMLauncher.java b/src/main/java/com/replaymod/core/ReplayModNonMMLauncher.java index 41a350d8..283cb69f 100644 --- a/src/main/java/com/replaymod/core/ReplayModNonMMLauncher.java +++ b/src/main/java/com/replaymod/core/ReplayModNonMMLauncher.java @@ -1,62 +1,62 @@ //#if FABRIC>=1 -package com.replaymod.core; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.objectweb.asm.tree.ClassNode; -import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -import org.spongepowered.asm.mixin.extensibility.IMixinInfo; - -import java.io.IOException; -import java.util.List; -import java.util.Set; - -// See ReplayModMMLauncher. This is the fallback if MM is not installed. -public class ReplayModNonMMLauncher implements IMixinConfigPlugin { - private final Logger logger = LogManager.getLogger("replaymod/nonmm"); - - @Override - public void onLoad(String mixinPackage) { - } - - @Override - public String getRefMapperConfig() { - return null; - } - - @Override - public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - return false; - } - - @Override - public void acceptTargets(Set myTargets, Set otherTargets) { - - } - - @Override - public List getMixins() { - try { - if (ReplayModMixinConfigPlugin.hasClass("com.chocohead.mm.Plugin")) { - logger.debug("Detected MM, they should call us..."); - } else { - logger.debug("Did not detect MM, initializing ourselves..."); - new ReplayModMMLauncher().run(); - } - return null; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - - } - - @Override - public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - - } -} +//$$ package com.replaymod.core; +//$$ +//$$ import org.apache.logging.log4j.LogManager; +//$$ import org.apache.logging.log4j.Logger; +//$$ import org.objectweb.asm.tree.ClassNode; +//$$ import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +//$$ import org.spongepowered.asm.mixin.extensibility.IMixinInfo; +//$$ +//$$ import java.io.IOException; +//$$ import java.util.List; +//$$ import java.util.Set; +//$$ +//$$ // See ReplayModMMLauncher. This is the fallback if MM is not installed. +//$$ public class ReplayModNonMMLauncher implements IMixinConfigPlugin { +//$$ private final Logger logger = LogManager.getLogger("replaymod/nonmm"); +//$$ +//$$ @Override +//$$ public void onLoad(String mixinPackage) { +//$$ } +//$$ +//$$ @Override +//$$ public String getRefMapperConfig() { +//$$ return null; +//$$ } +//$$ +//$$ @Override +//$$ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { +//$$ return false; +//$$ } +//$$ +//$$ @Override +//$$ public void acceptTargets(Set myTargets, Set otherTargets) { +//$$ +//$$ } +//$$ +//$$ @Override +//$$ public List getMixins() { +//$$ try { +//$$ if (ReplayModMixinConfigPlugin.hasClass("com.chocohead.mm.Plugin")) { +//$$ logger.debug("Detected MM, they should call us..."); +//$$ } else { +//$$ logger.debug("Did not detect MM, initializing ourselves..."); +//$$ new ReplayModMMLauncher().run(); +//$$ } +//$$ return null; +//$$ } catch (IOException e) { +//$$ throw new RuntimeException(e); +//$$ } +//$$ } +//$$ +//$$ @Override +//$$ public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { +//$$ +//$$ } +//$$ +//$$ @Override +//$$ public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { +//$$ +//$$ } +//$$ } //#endif diff --git a/src/main/java/com/replaymod/core/SettingsRegistryBackend.java b/src/main/java/com/replaymod/core/SettingsRegistryBackend.java index eb996915..bbc15cf0 100644 --- a/src/main/java/com/replaymod/core/SettingsRegistryBackend.java +++ b/src/main/java/com/replaymod/core/SettingsRegistryBackend.java @@ -7,7 +7,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.replaymod.core.events.SettingsChangedCallback; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -28,7 +28,7 @@ class SettingsRegistryBackend { private static final Logger LOGGER = LogManager.getLogger(); private final Map, Object> settings; - private final Path configFile = getMinecraft().runDirectory.toPath().resolve("config/replaymod.json"); + private final Path configFile = getMinecraft().gameDir.toPath().resolve("config/replaymod.json"); SettingsRegistryBackend(Map, Object> settings) { this.settings = settings; @@ -116,7 +116,7 @@ private void registerWatcher() throws IOException { } Path fileName = ((Path) event.context()); if (fileName.equals(configFile.getFileName())) { - MinecraftClient.getInstance().send(this::reload); + Minecraft.getInstance().enqueue(this::reload); } } if (!nextKey.reset()) { diff --git a/src/main/java/com/replaymod/core/events/PostRenderWorldCallback.java b/src/main/java/com/replaymod/core/events/PostRenderWorldCallback.java index 00e73388..9008ef2f 100644 --- a/src/main/java/com/replaymod/core/events/PostRenderWorldCallback.java +++ b/src/main/java/com/replaymod/core/events/PostRenderWorldCallback.java @@ -1,7 +1,7 @@ package com.replaymod.core.events; import com.replaymod.gui.utils.Event; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.matrix.MatrixStack; public interface PostRenderWorldCallback { Event EVENT = Event.create((listeners) -> diff --git a/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java b/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java index 999c7b02..8c93f4a6 100644 --- a/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java +++ b/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java @@ -14,7 +14,7 @@ import com.replaymod.gui.utils.Consumer; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; import java.util.List; @@ -24,7 +24,7 @@ public GuiReplaySettings(final net.minecraft.client.gui.screen.Screen parent, fi final GuiButton doneButton = new GuiButton(this).setI18nLabel("gui.done").setSize(200, 20).onClick(new Runnable() { @Override public void run() { - getMinecraft().openScreen(parent); + getMinecraft().displayGuiScreen(parent); } }); @@ -43,7 +43,7 @@ public void run() { final SettingsRegistry.SettingKey booleanKey = (SettingsRegistry.SettingKey) key; final GuiToggleButton button = new GuiToggleButton<>().setSize(150, 20) .setI18nLabel(key.getDisplayString()).setSelected(settingsRegistry.get(booleanKey) ? 0 : 1) - .setValues(I18n.translate("options.on"), I18n.translate("options.off")); + .setValues(I18n.format("options.on"), I18n.format("options.off")); element = button.onClick(new Runnable() { @Override public void run() { @@ -61,7 +61,7 @@ public void run() { for (int j = 0; j < entries.length; j++) { Object value = values.get(j); entries[j] = new MultipleChoiceDropdownEntry(value, - I18n.translate(multipleChoiceKey.getDisplayString()) + ": " + I18n.translate(value.toString())); + I18n.format(multipleChoiceKey.getDisplayString()) + ": " + I18n.format(value.toString())); if (currentValue.equals(value)) { selected = j; } diff --git a/src/main/java/com/replaymod/core/gui/ModMenuApiImpl.java b/src/main/java/com/replaymod/core/gui/ModMenuApiImpl.java index 666a3174..04cc9341 100644 --- a/src/main/java/com/replaymod/core/gui/ModMenuApiImpl.java +++ b/src/main/java/com/replaymod/core/gui/ModMenuApiImpl.java @@ -1,21 +1,21 @@ //#if FABRIC>=1 -package com.replaymod.core.gui; - -import com.replaymod.core.ReplayMod; -import io.github.prospector.modmenu.api.ModMenuApi; -import net.minecraft.client.gui.screen.Screen; - -import java.util.function.Function; - -public class ModMenuApiImpl implements ModMenuApi { - @Override - public String getModId() { - return ReplayMod.MOD_ID; - } - - @Override - public Function getConfigScreenFactory() { - return parent -> new GuiReplaySettings(parent, ReplayMod.instance.getSettingsRegistry()).toMinecraft(); - } -} +//$$ package com.replaymod.core.gui; +//$$ +//$$ import com.replaymod.core.ReplayMod; +//$$ import io.github.prospector.modmenu.api.ModMenuApi; +//$$ import net.minecraft.client.gui.screen.Screen; +//$$ +//$$ import java.util.function.Function; +//$$ +//$$ public class ModMenuApiImpl implements ModMenuApi { +//$$ @Override +//$$ public String getModId() { +//$$ return ReplayMod.MOD_ID; +//$$ } +//$$ +//$$ @Override +//$$ public Function getConfigScreenFactory() { +//$$ return parent -> new GuiReplaySettings(parent, ReplayMod.instance.getSettingsRegistry()).toMinecraft(); +//$$ } +//$$ } //#endif diff --git a/src/main/java/com/replaymod/core/gui/RestoreReplayGui.java b/src/main/java/com/replaymod/core/gui/RestoreReplayGui.java index d217a543..a2ccc96c 100644 --- a/src/main/java/com/replaymod/core/gui/RestoreReplayGui.java +++ b/src/main/java/com/replaymod/core/gui/RestoreReplayGui.java @@ -20,7 +20,7 @@ import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.layout.VerticalLayout; import com.replaymod.gui.utils.Colors; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.crash.CrashReport; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.logging.log4j.LogManager; @@ -99,7 +99,7 @@ private void recoverInBackground() { tryRecover(progressBar::setProgress); } catch (IOException e) { LOGGER.error("Recovering replay file:", e); - CrashReport crashReport = CrashReport.create(e, "Recovering replay file"); + CrashReport crashReport = CrashReport.makeCrashReport(e, "Recovering replay file"); core.runLater(() -> Utils.error(LOGGER, VanillaGuiScreen.wrap(getMinecraft().currentScreen), crashReport, () -> {})); } finally { core.runLater(() -> core.getBackgroundProcesses().removeProcess(savingProcess)); diff --git a/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java b/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java index c690defc..0e4bb1ae 100644 --- a/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java +++ b/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java @@ -1 +1,122 @@ -// Forge only +package com.replaymod.core.tweaker; + +/* +import com.replaymod.extras.modcore.ModCoreInstaller; +import net.minecraft.launchwrapper.ITweaker; +import net.minecraft.launchwrapper.Launch; +import net.minecraft.launchwrapper.LaunchClassLoader; +import org.spongepowered.asm.launch.GlobalProperties; +import org.spongepowered.asm.launch.MixinBootstrap; +import org.spongepowered.asm.launch.platform.MixinPlatformManager; + +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +//#if MC>=11200 +import org.spongepowered.asm.launch.platform.container.ContainerHandleURI; +//#endif + +// Fabric equivalent is in ReplayModMMLauncher +public class ReplayModTweaker implements ITweaker { + + private static final String MIXIN_TWEAKER = "org.spongepowered.asm.launch.MixinTweaker"; + + public ReplayModTweaker() { + injectMixinTweaker(); + } + + private void injectMixinTweaker() { + @SuppressWarnings("unchecked") + List tweakClasses = (List) Launch.blackboard.get("TweakClasses"); + + // If the MixinTweaker is already queued (because of anothe r mod), then there's nothing we need to to + if (tweakClasses.contains(MIXIN_TWEAKER)) { + return; + } + + // If it is already booted, we're also good to go + if (GlobalProperties.get(GlobalProperties.Keys.INIT) != null) { + return; + } + + System.out.println("Injecting MixinTweaker from ReplayModTweaker"); + + // Otherwise, we need to take things into our own hands because the normal way to chainload a tweaker + // (by adding it to the TweakClasses list during injectIntoClassLoader) is too late for Mixin. + // Instead we instantiate the MixinTweaker on our own and add it to the current Tweaks list immediately. + Launch.classLoader.addClassLoaderExclusion(MIXIN_TWEAKER.substring(0, MIXIN_TWEAKER.lastIndexOf('.'))); + @SuppressWarnings("unchecked") + List tweaks = (List) Launch.blackboard.get("Tweaks"); + try { + tweaks.add((ITweaker) Class.forName(MIXIN_TWEAKER, true, Launch.classLoader).newInstance()); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public void acceptOptions(List args, File gameDir, File assetsDir, String profile) { + } + + @Override + public void injectIntoClassLoader(LaunchClassLoader classLoader) { + // Add our jar as a Mixin container (cause normally Mixin detects those via the TweakClass manifest entry) + URI uri; + try { + uri = this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + MixinPlatformManager platform = MixinBootstrap.getPlatform(); + //#if MC>=11200 + platform.addContainer(new ContainerHandleURI(uri)); + //#else + //$$ platform.addContainer(uri); + //#endif + + //#if MC>=11202 && MC<=11202 + initModCore("1.12.2"); + //#endif + //#if MC>=10809 && MC<=10809 + //$$ initModCore("1.8.9"); + //#endif + } + + @Override + public String getLaunchTarget() { + return null; + } + + @Override + public String[] getLaunchArguments() { + return new String[0]; + } + + private void initModCore(String mcVer) { + try { + if (System.getProperty("REPLAYMOD_SKIP_MODCORE", "false").equalsIgnoreCase("true")) { + System.out.println("ReplayMod not initializing ModCore because REPLAYMOD_SKIP_MODCORE is true."); + return; + } + + if ((Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment")) { + System.out.println("ReplayMod not initializing ModCore because we're in a development environment."); + return; + } + + int result = ModCoreInstaller.initialize(Launch.minecraftHome, mcVer + "_forge"); + if (result != -2) { // Don't even bother logging the result if there's no ModCore for this version. + System.out.println("ReplayMod ModCore init result: " + result); + } + if (ModCoreInstaller.isErrored()) { + System.err.println(ModCoreInstaller.getError()); + } + } catch (Throwable t) { + System.err.println("ReplayMod caught error during ModCore init:"); + t.printStackTrace(); + } + } +} +*/ diff --git a/src/main/java/com/replaymod/core/utils/ModInfoGetter.java b/src/main/java/com/replaymod/core/utils/ModInfoGetter.java index d4bbe156..1883a24f 100644 --- a/src/main/java/com/replaymod/core/utils/ModInfoGetter.java +++ b/src/main/java/com/replaymod/core/utils/ModInfoGetter.java @@ -1,25 +1,23 @@ package com.replaymod.core.utils; -import com.replaymod.replaystudio.data.ModInfo; -import net.minecraft.util.Identifier; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import net.minecraft.util.registry.Registry; +import com.replaymod.replaystudio.data.ModInfo; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.registries.ForgeRegistry; +import net.minecraftforge.registries.GameData; -import java.util.*; +import java.util.Collection; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; class ModInfoGetter { static Collection getInstalledNetworkMods() { - Map modInfoMap = FabricLoader.getInstance().getAllMods().stream() - .map(ModContainer::getMetadata) - .map(m -> new ModInfo(m.getId(), m.getName(), m.getVersion().toString())) - .collect(Collectors.toMap(ModInfo::getId, Function.identity())); - return Registry.REGISTRIES.stream() - .map(Registry::getIds).flatMap(Set::stream) - .map(Identifier::getNamespace).filter(s -> !s.equals("minecraft")).distinct() - .map(modInfoMap::get).filter(Objects::nonNull) + return ModList.get().getMods().stream() + .map(mod -> new ModInfo(mod.getModId(), mod.getModId(), mod.getVersion().toString())) .collect(Collectors.toList()); } } diff --git a/src/main/java/com/replaymod/core/utils/Restrictions.java b/src/main/java/com/replaymod/core/utils/Restrictions.java index 359eaf77..6e133e8b 100644 --- a/src/main/java/com/replaymod/core/utils/Restrictions.java +++ b/src/main/java/com/replaymod/core/utils/Restrictions.java @@ -1,9 +1,9 @@ package com.replaymod.core.utils; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.play.server.SCustomPayloadPlayPacket; +import net.minecraft.network.PacketBuffer; //#if MC>=10904 -import net.minecraft.util.Identifier; +import net.minecraft.util.ResourceLocation; //#endif //#if MC<=10710 @@ -16,7 +16,7 @@ */ public class Restrictions { //#if MC>=11400 - public static final Identifier PLUGIN_CHANNEL = new Identifier("replaymod", "restrict"); + public static final ResourceLocation PLUGIN_CHANNEL = new ResourceLocation("replaymod", "restrict"); //#else //$$ public static final String PLUGIN_CHANNEL = "Replay|Restrict"; //#endif @@ -25,9 +25,9 @@ public class Restrictions { private boolean onlyFirstPerson; private boolean onlyRecordingPlayer; - public String handle(CustomPayloadS2CPacket packet) { + public String handle(SCustomPayloadPlayPacket packet) { //#if MC>=10800 - PacketByteBuf buffer = packet.getData(); + PacketBuffer buffer = packet.getBufferData(); //#else //$$ PacketBuffer buffer = new PacketBuffer(Unpooled.wrappedBuffer(packet.func_149168_d())); //#endif diff --git a/src/main/java/com/replaymod/core/utils/Utils.java b/src/main/java/com/replaymod/core/utils/Utils.java index 4b8f6d87..8775f415 100644 --- a/src/main/java/com/replaymod/core/utils/Utils.java +++ b/src/main/java/com/replaymod/core/utils/Utils.java @@ -25,8 +25,8 @@ import com.replaymod.gui.versions.Image; import com.replaymod.gui.versions.MCVer; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.Identifier; +import net.minecraft.crash.CrashReport; +import net.minecraft.util.ResourceLocation; import org.apache.commons.io.Charsets; import org.apache.commons.io.FilenameUtils; import org.apache.logging.log4j.LogManager; @@ -38,8 +38,8 @@ //#endif //#if MC>=10800 -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.client.util.DefaultSkinHelper; +import net.minecraft.client.network.play.NetworkPlayerInfo; +import net.minecraft.client.resources.DefaultPlayerSkin; //#else //$$ import net.minecraft.client.Minecraft; //$$ import net.minecraft.client.entity.AbstractClientPlayer; @@ -180,23 +180,23 @@ public static String fileNameToReplayName(String fileName) { } } - public static Identifier getResourceLocationForPlayerUUID(UUID uuid) { + public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) { //#if MC>=10800 - PlayerListEntry info = getMinecraft().getNetworkHandler().getPlayerListEntry(uuid); - Identifier skinLocation; + NetworkPlayerInfo info = getMinecraft().getConnection().getPlayerInfo(uuid); + ResourceLocation skinLocation; //#if FABRIC>=1 - if (info != null && info.hasSkinTexture()) { - skinLocation = info.getSkinTexture(); - } else { - skinLocation = DefaultSkinHelper.getTexture(uuid); - } - //#else - //$$ if (info != null && info.hasLocationSkin()) { - //$$ skinLocation = info.getLocationSkin(); + //$$ if (info != null && info.hasSkinTexture()) { + //$$ skinLocation = info.getSkinTexture(); //$$ } else { - //$$ skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid); + //$$ skinLocation = DefaultSkinHelper.getTexture(uuid); //$$ } + //#else + if (info != null && info.hasLocationSkin()) { + skinLocation = info.getLocationSkin(); + } else { + skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid); + } //#endif return skinLocation; //#else @@ -232,7 +232,7 @@ public void onFailure(@Nonnull Throwable t) { public static GuiInfoPopup error(Logger logger, GuiContainer container, CrashReport crashReport, Runnable onClose) { // Convert crash report to string - String crashReportStr = crashReport.asString(); + String crashReportStr = crashReport.getCompleteReport(); // Log via logger logger.error(crashReportStr); @@ -240,10 +240,10 @@ public static GuiInfoPopup error(Logger logger, GuiContainer container, CrashRep // Try to save the crash report if (crashReport.getFile() == null) { try { - File folder = new File(getMinecraft().runDirectory, "crash-reports"); + File folder = new File(getMinecraft().gameDir, "crash-reports"); File file = new File(folder, "crash-" + (new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss")).format(new Date()) + "-client.txt"); logger.debug("Saving crash report to file: {}", file); - crashReport.writeToFile(file); + crashReport.saveToFile(file); } catch (Throwable t) { logger.error("Saving crash report file:", t); } diff --git a/src/main/java/com/replaymod/core/utils/WrappedTimer.java b/src/main/java/com/replaymod/core/utils/WrappedTimer.java index 05452c1c..8eaf1118 100644 --- a/src/main/java/com/replaymod/core/utils/WrappedTimer.java +++ b/src/main/java/com/replaymod/core/utils/WrappedTimer.java @@ -1,14 +1,14 @@ package com.replaymod.core.utils; import com.replaymod.mixin.TimerAccessor; -import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.util.Timer; -public class WrappedTimer extends RenderTickCounter { +public class WrappedTimer extends Timer { public static final float DEFAULT_MS_PER_TICK = 1000 / 20; - protected final RenderTickCounter wrapped; + protected final Timer wrapped; - public WrappedTimer(RenderTickCounter wrapped) { + public WrappedTimer(Timer wrapped) { //#if MC>=11400 super(0, 0); //#else @@ -25,7 +25,7 @@ public WrappedTimer(RenderTickCounter wrapped) { //#else //$$ void //#endif - beginRenderTick( + getPartialTicks( //#if MC>=11400 long sysClock //#endif @@ -35,7 +35,7 @@ public WrappedTimer(RenderTickCounter wrapped) { //#if MC>=11600 return //#endif - wrapped.beginRenderTick( + wrapped.getPartialTicks( //#if MC>=11400 sysClock //#endif @@ -45,16 +45,16 @@ public WrappedTimer(RenderTickCounter wrapped) { } } - protected void copy(RenderTickCounter from, RenderTickCounter to) { + protected void copy(Timer from, Timer to) { TimerAccessor fromA = (TimerAccessor) from; TimerAccessor toA = (TimerAccessor) to; //#if MC<11600 //$$ to.ticksThisFrame = from.ticksThisFrame; //#endif - to.tickDelta = from.tickDelta; + to.renderPartialTicks = from.renderPartialTicks; toA.setLastSyncSysClock(fromA.getLastSyncSysClock()); - to.lastFrameDuration = from.lastFrameDuration; + to.elapsedPartialTicks = from.elapsedPartialTicks; //#if MC>=11200 toA.setTickLength(fromA.getTickLength()); //#else diff --git a/src/main/java/com/replaymod/core/versions/LangResourcePack.java b/src/main/java/com/replaymod/core/versions/LangResourcePack.java index 63e4304c..53823b24 100644 --- a/src/main/java/com/replaymod/core/versions/LangResourcePack.java +++ b/src/main/java/com/replaymod/core/versions/LangResourcePack.java @@ -3,10 +3,10 @@ import com.google.gson.Gson; import com.replaymod.core.ReplayMod; -import net.minecraft.resource.AbstractFileResourcePack; -import net.minecraft.resource.ResourceNotFoundException; -import net.minecraft.resource.ResourceType; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourcePack; +import net.minecraft.resources.ResourcePackFileNotFoundException; +import net.minecraft.resources.ResourcePackType; +import net.minecraft.util.ResourceLocation; import org.apache.commons.io.IOUtils; import java.io.ByteArrayInputStream; @@ -28,8 +28,8 @@ import java.util.stream.Collectors; //#if FABRIC>=1 -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; +//$$ import net.fabricmc.loader.api.FabricLoader; +//$$ import net.fabricmc.loader.api.ModContainer; //#else //#endif @@ -46,7 +46,7 @@ * Resource pack which on-the-fly converts pre-1.13 language files into 1.13 json format. * Also duplicates `replaymod.input.*` bindings to `key.replaymod.*` as convention on Fabric. */ -public class LangResourcePack extends AbstractFileResourcePack { +public class LangResourcePack extends ResourcePack { private static final Gson GSON = new Gson(); public static final String NAME = "replaymod_lang"; private static final Pattern JSON_FILE_PATTERN = Pattern.compile("^assets/" + ReplayMod.MOD_ID + "/lang/([a-z][a-z])_([a-z][a-z]).json$"); @@ -61,10 +61,10 @@ public LangResourcePack() { super(new File(NAME)); //#if FABRIC>=1 - ModContainer container = FabricLoader.getInstance().getModContainer(ReplayMod.MOD_ID).orElseThrow(IllegalAccessError::new); - this.basePath = container.getRootPath(); + //$$ ModContainer container = FabricLoader.getInstance().getModContainer(ReplayMod.MOD_ID).orElseThrow(IllegalAccessError::new); + //$$ this.basePath = container.getRootPath(); //#else - //$$ this.basePath = null; // stub + this.basePath = null; // stub //#endif } //#else @@ -111,13 +111,13 @@ private String convertValue(String value) { } @Override - protected InputStream openFile(String path) throws IOException { + protected InputStream getInputStream(String path) throws IOException { if ("pack.mcmeta".equals(path)) { return new ByteArrayInputStream("{\"pack\": {\"description\": \"ReplayMod language files\", \"pack_format\": 4}}".getBytes(StandardCharsets.UTF_8)); } Path langPath = langPath(path); - if (langPath == null) throw new ResourceNotFoundException(this.base, path); + if (langPath == null) throw new ResourcePackFileNotFoundException(this.file, path); List langFile; try (InputStream in = Files.newInputStream(langPath)) { @@ -145,15 +145,15 @@ protected InputStream openFile(String path) throws IOException { } @Override - protected boolean containsFile(String path) { + protected boolean resourceExists(String path) { Path langPath = langPath(path); return langPath != null && Files.exists(langPath); } @Override - public Collection findResources( - ResourceType resourcePackType, + public Collection getAllResourceLocations( + ResourcePackType resourcePackType, //#if MC>=11500 String namespace, //#endif @@ -161,7 +161,7 @@ public Collection findResources( int maxDepth, Predicate filter ) { - if (resourcePackType == ResourceType.CLIENT_RESOURCES && "lang".equals(path)) { + if (resourcePackType == ResourcePackType.CLIENT_RESOURCES && "lang".equals(path)) { Path base = baseLangPath(); //#if MC<11400 //$$ if (base == null) return Collections.emptyList(); @@ -175,7 +175,7 @@ public Collection findResources( .filter(Matcher::matches) .map(matcher -> String.format("%s_%s.json", matcher.group(1), matcher.group(1))) .filter(filter::test) - .map(name -> new Identifier(ReplayMod.MOD_ID, "lang/" + name)) + .map(name -> new ResourceLocation(ReplayMod.MOD_ID, "lang/" + name)) .collect(Collectors.toList()); } catch (IOException e) { e.printStackTrace(); @@ -187,8 +187,8 @@ public Collection findResources( } @Override - public Set getNamespaces(ResourceType resourcePackType) { - if (resourcePackType == ResourceType.CLIENT_RESOURCES) { + public Set getResourceNamespaces(ResourcePackType resourcePackType) { + if (resourcePackType == ResourcePackType.CLIENT_RESOURCES) { return Collections.singleton("replaymod"); } else { return Collections.emptySet(); diff --git a/src/main/java/com/replaymod/core/versions/MCVer.java b/src/main/java/com/replaymod/core/versions/MCVer.java index 6b5cbeff..c47fd620 100644 --- a/src/main/java/com/replaymod/core/versions/MCVer.java +++ b/src/main/java/com/replaymod/core/versions/MCVer.java @@ -5,25 +5,25 @@ import com.replaymod.replaystudio.protocol.PacketTypeRegistry; import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersion; import com.replaymod.replaystudio.us.myles.ViaVersion.packets.State; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.Util; //#if MC>=11600 -import net.minecraft.resource.ResourcePackSource; +import net.minecraft.resources.IPackNameDecorator; //#endif //#if MC>=11400 import com.replaymod.mixin.MainWindowAccessor; -import net.minecraft.SharedConstants; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.util.SharedConstants; +import net.minecraft.client.shader.Framebuffer; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.client.gui.widget.Widget; import java.util.concurrent.CompletableFuture; //#if MC>=11600 -import net.minecraft.text.TranslatableText; +import net.minecraft.util.text.TranslationTextComponent; //#else //$$ import net.minecraft.client.resource.language.I18n; //#endif @@ -36,7 +36,7 @@ //#endif //#if MC>=11400 -import net.minecraft.client.util.InputUtil; +import net.minecraft.client.util.InputMappings; import org.lwjgl.glfw.GLFW; //#else //$$ import net.minecraft.client.resources.ResourcePackRepository; @@ -50,12 +50,12 @@ //#if MC>=10904 import com.replaymod.mixin.ParticleAccessor; import net.minecraft.client.particle.Particle; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.vector.Vector3d; //#endif //#if MC>=10800 -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormatElement; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.renderer.vertex.VertexFormatElement; //#if MC<11500 //$$ import net.minecraft.client.render.chunk.ChunkRenderTask; //#endif @@ -81,7 +81,7 @@ public class MCVer { public static int getProtocolVersion() { //#if MC>=11400 - return SharedConstants.getGameVersion().getProtocolVersion(); + return SharedConstants.getVersion().getProtocolVersion(); //#else //$$ return RealmsSharedConstants.NETWORK_PROTOCOL_VERSION; //#endif @@ -94,18 +94,18 @@ public static PacketTypeRegistry getPacketTypeRegistry(boolean loginPhase) { ); } - public static void resizeMainWindow(MinecraftClient mc, int width, int height) { + public static void resizeMainWindow(Minecraft mc, int width, int height) { //#if MC>=11400 Framebuffer fb = mc.getFramebuffer(); - if (fb.viewportWidth != width || fb.viewportHeight != height) { + if (fb.framebufferWidth != width || fb.framebufferHeight != height) { fb.resize(width, height, false); } //noinspection ConstantConditions - MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) mc.getWindow(); + MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) mc.getMainWindow(); mainWindow.setFramebufferWidth(width); mainWindow.setFramebufferHeight(height); //#if MC>=11500 - mc.gameRenderer.onResized(width, height); + mc.gameRenderer.updateShaderGroupSize(width, height); //#endif //#else //$$ if (width != mc.displayWidth || height != mc.displayHeight) { @@ -132,10 +132,10 @@ public static void resizeMainWindow(MinecraftClient mc, int width, int height) { //#endif setServerResourcePack(File file) { //#if MC>=11400 - return getMinecraft().getResourcePackDownloader().loadServerPack( + return getMinecraft().getPackFinder().setServerPack( file //#if MC>=11600 - , ResourcePackSource.PACK_SOURCE_SERVER + , IPackNameDecorator.SERVER //#endif ); //#else @@ -194,14 +194,14 @@ public static List getElements(VertexFormat vertexFormat) { //$$ } //#endif - public static MinecraftClient getMinecraft() { - return MinecraftClient.getInstance(); + public static Minecraft getMinecraft() { + return Minecraft.getInstance(); } public static void addButton( Screen screen, //#if MC>=11400 - ButtonWidget button + Button button //#else //$$ GuiButton button //#endif @@ -214,19 +214,19 @@ public static void addButton( } //#if MC>=11400 - public static Optional findButton(List buttonList, @SuppressWarnings("unused") String text, @SuppressWarnings("unused") int id) { + public static Optional findButton(List buttonList, @SuppressWarnings("unused") String text, @SuppressWarnings("unused") int id) { //#if MC>=11600 - final TranslatableText message = new TranslatableText(text); + final TranslationTextComponent message = new TranslationTextComponent(text); //#else //$$ final String message = I18n.translate(text); //#endif - for (AbstractButtonWidget b : buttonList) { + for (Widget b : buttonList) { if (message.equals(b.getMessage())) { return Optional.of(b); } //#if MC>=11600 // Fuzzy match (copy does not include children) - if (b.getMessage() != null && b.getMessage().copy().equals(message)) { + if (b.getMessage() != null && b.getMessage().copyRaw().equals(message)) { return Optional.of(b); } //#endif @@ -258,7 +258,7 @@ public static void processKeyBinds() { public static long milliTime() { //#if MC>=11400 - return Util.getMeasuringTimeMs(); + return Util.milliTime(); //#else //$$ return Minecraft.getSystemTime(); //#endif @@ -266,18 +266,18 @@ public static long milliTime() { //#if MC>=10904 // TODO: this can be inlined once https://github.com/SpongePowered/Mixin/issues/305 is fixed - public static Vec3d getPosition(Particle particle, float partialTicks) { + public static Vector3d getPosition(Particle particle, float partialTicks) { ParticleAccessor acc = (ParticleAccessor) particle; double x = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * partialTicks; double y = acc.getPrevPosY() + (acc.getPosY() - acc.getPrevPosY()) * partialTicks; double z = acc.getPrevPosZ() + (acc.getPosZ() - acc.getPrevPosZ()) * partialTicks; - return new Vec3d(x, y, z); + return new Vector3d(x, y, z); } //#endif public static void openFile(File file) { //#if MC>=11400 - Util.getOperatingSystem().open(file); + Util.getOSType().openFile(file); //#else //$$ String path = file.getAbsolutePath(); //$$ @@ -307,7 +307,7 @@ public static void openFile(File file) { public static void openURL(URI url) { //#if MC>=11400 - Util.getOperatingSystem().open(url); + Util.getOSType().openURI(url); //#else //$$ try { //$$ Desktop.getDesktop().browse(url); @@ -448,7 +448,7 @@ public static boolean hasControlDown() { public static boolean isKeyDown(int keyCode) { //#if MC>=11500 - return InputUtil.isKeyPressed(getMinecraft().getWindow().getHandle(), keyCode); + return InputMappings.isKeyDown(getMinecraft().getMainWindow().getHandle(), keyCode); //#else //#if MC>=11400 //$$ return InputUtil.isKeyPressed(getMinecraft().window.getHandle(), keyCode); diff --git a/src/main/java/com/replaymod/core/versions/Patterns.java b/src/main/java/com/replaymod/core/versions/Patterns.java index 8c62dd6c..ac9f6d9f 100644 --- a/src/main/java/com/replaymod/core/versions/Patterns.java +++ b/src/main/java/com/replaymod/core/versions/Patterns.java @@ -1,42 +1,42 @@ package com.replaymod.core.versions; import com.replaymod.gradle.remap.Pattern; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.options.KeyBinding; -import net.minecraft.client.texture.TextureManager; +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.world.ClientWorld; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.sound.PositionedSoundInstance; -import net.minecraft.util.crash.CrashReportSection; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.audio.SimpleSound; +import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.Identifier; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; -import net.minecraft.world.chunk.WorldChunk; +import net.minecraft.world.chunk.Chunk; //#if MC>=11400 -import net.minecraft.client.gui.widget.AbstractButtonWidget; -import net.minecraft.client.util.Window; +import net.minecraft.client.gui.widget.Widget; +import net.minecraft.client.MainWindow; //#else //$$ import net.minecraft.client.gui.GuiButton; //#endif //#if MC>=10904 -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.crash.CrashCallable; +import net.minecraft.util.SoundEvent; +import net.minecraft.crash.ICrashReportDetail; //#else //$$ import java.util.concurrent.Callable; //#endif //#if MC>=10809 -import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; //#else //#endif //#if MC>=10800 -import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.renderer.BufferBuilder; //#else //$$ import net.minecraft.entity.EntityLivingBase; //#endif @@ -47,9 +47,9 @@ class Patterns { //#if MC>=10904 @Pattern - private static void addCrashCallable(CrashReportSection category, String name, CrashCallable callable) { + private static void addCrashCallable(CrashReportCategory category, String name, ICrashReportDetail callable) { //#if MC>=11200 - category.add(name, callable); + category.addDetail(name, callable); //#else //$$ category.setDetail(name, callable); //#endif @@ -64,7 +64,7 @@ private static void addCrashCallable(CrashReportSection category, String name, C @Pattern private static double Entity_getX(Entity entity) { //#if MC>=11500 - return entity.getX(); + return entity.getPosX(); //#else //$$ return entity.x; //#endif @@ -73,7 +73,7 @@ private static double Entity_getX(Entity entity) { @Pattern private static double Entity_getY(Entity entity) { //#if MC>=11500 - return entity.getY(); + return entity.getPosY(); //#else //$$ return entity.y; //#endif @@ -82,7 +82,7 @@ private static double Entity_getY(Entity entity) { @Pattern private static double Entity_getZ(Entity entity) { //#if MC>=11500 - return entity.getZ(); + return entity.getPosZ(); //#else //$$ return entity.z; //#endif @@ -91,7 +91,7 @@ private static double Entity_getZ(Entity entity) { @Pattern private static void Entity_setPos(Entity entity, double x, double y, double z) { //#if MC>=11500 - entity.setPos(x, y, z); + entity.setRawPosition(x, y, z); //#else //$$ { net.minecraft.entity.Entity self = entity; self.x = x; self.y = y; self.z = z; } //#endif @@ -99,17 +99,17 @@ private static void Entity_setPos(Entity entity, double x, double y, double z) { //#if MC>=11400 @Pattern - private static void setWidth(AbstractButtonWidget button, int value) { + private static void setWidth(Widget button, int value) { button.setWidth(value); } @Pattern - private static int getWidth(AbstractButtonWidget button) { + private static int getWidth(Widget button) { return button.getWidth(); } @Pattern - private static int getHeight(AbstractButtonWidget button) { + private static int getHeight(Widget button) { //#if MC>=11600 return button.getHeight(); //#else @@ -134,7 +134,7 @@ private static int getHeight(AbstractButtonWidget button) { //#endif @Pattern - private static String readString(PacketByteBuf buffer, int max) { + private static String readString(PacketBuffer buffer, int max) { //#if MC>=10800 return buffer.readString(max); //#else @@ -144,8 +144,8 @@ private static String readString(PacketByteBuf buffer, int max) { @Pattern //#if MC>=10800 - private static Entity getRenderViewEntity(MinecraftClient mc) { - return mc.getCameraEntity(); + private static Entity getRenderViewEntity(Minecraft mc) { + return mc.getRenderViewEntity(); } //#else //$$ private static EntityLivingBase getRenderViewEntity(Minecraft mc) { @@ -155,8 +155,8 @@ private static Entity getRenderViewEntity(MinecraftClient mc) { @Pattern //#if MC>=10800 - private static void setRenderViewEntity(MinecraftClient mc, Entity entity) { - mc.setCameraEntity(entity); + private static void setRenderViewEntity(Minecraft mc, Entity entity) { + mc.setRenderViewEntity(entity); } //#else //$$ private static void setRenderViewEntity(Minecraft mc, EntityLivingBase entity) { @@ -167,7 +167,7 @@ private static void setRenderViewEntity(MinecraftClient mc, Entity entity) { @Pattern private static Entity getVehicle(Entity passenger) { //#if MC>=10904 - return passenger.getVehicle(); + return passenger.getRidingEntity(); //#else //$$ return passenger.ridingEntity; //#endif @@ -176,7 +176,7 @@ private static Entity getVehicle(Entity passenger) { @Pattern private static Iterable loadedEntityList(ClientWorld world) { //#if MC>=11400 - return world.getEntities(); + return world.getAllEntities(); //#else //#if MC>=10809 //$$ return world.loadedEntityList; @@ -187,9 +187,9 @@ private static Iterable loadedEntityList(ClientWorld world) { } @Pattern - private static Collection[] getEntitySectionArray(WorldChunk chunk) { + private static Collection[] getEntitySectionArray(Chunk chunk) { //#if MC>=10800 - return chunk.getEntitySectionArray(); + return chunk.getEntityLists(); //#else //$$ return chunk.entityLists; //#endif @@ -207,27 +207,27 @@ private static List playerEntities(World world) { } @Pattern - private static boolean isOnMainThread(MinecraftClient mc) { + private static boolean isOnMainThread(Minecraft mc) { //#if MC>=11400 - return mc.isOnThread(); + return mc.isOnExecutionThread(); //#else //$$ return mc.isCallingFromMinecraftThread(); //#endif } @Pattern - private static void scheduleOnMainThread(MinecraftClient mc, Runnable runnable) { + private static void scheduleOnMainThread(Minecraft mc, Runnable runnable) { //#if MC>=11400 - mc.send(runnable); + mc.enqueue(runnable); //#else //$$ mc.addScheduledTask(runnable); //#endif } @Pattern - private static Window getWindow(MinecraftClient mc) { + private static MainWindow getWindow(Minecraft mc) { //#if MC>=11500 - return mc.getWindow(); + return mc.getMainWindow(); //#elseif MC>=11400 //$$ return mc.window; //#else @@ -247,7 +247,7 @@ private static BufferBuilder Tessellator_getBuffer(Tessellator tessellator) { @Pattern private static void BufferBuilder_beginPosCol(BufferBuilder buffer, int mode) { //#if MC>=10809 - buffer.begin(mode, VertexFormats.POSITION_COLOR); + buffer.begin(mode, DefaultVertexFormats.POSITION_COLOR); //#else //$$ buffer.startDrawing(mode /* POSITION_COLOR */); //#endif @@ -256,7 +256,7 @@ private static void BufferBuilder_beginPosCol(BufferBuilder buffer, int mode) { @Pattern private static void BufferBuilder_addPosCol(BufferBuilder buffer, double x, double y, double z, int r, int g, int b, int a) { //#if MC>=10809 - buffer.vertex(x, y, z).color(r, g, b, a).next(); + buffer.pos(x, y, z).color(r, g, b, a).endVertex(); //#else //$$ { WorldRenderer $buffer = buffer; double $x = x; double $y = y; double $z = z; $buffer.setColorRGBA(r, g, b, a); $buffer.addVertex($x, $y, $z); } //#endif @@ -265,7 +265,7 @@ private static void BufferBuilder_addPosCol(BufferBuilder buffer, double x, doub @Pattern private static void BufferBuilder_beginPosTex(BufferBuilder buffer, int mode) { //#if MC>=10809 - buffer.begin(mode, VertexFormats.POSITION_TEXTURE); + buffer.begin(mode, DefaultVertexFormats.POSITION_TEX); //#else //$$ buffer.startDrawing(mode /* POSITION_TEXTURE */); //#endif @@ -274,7 +274,7 @@ private static void BufferBuilder_beginPosTex(BufferBuilder buffer, int mode) { @Pattern private static void BufferBuilder_addPosTex(BufferBuilder buffer, double x, double y, double z, float u, float v) { //#if MC>=10809 - buffer.vertex(x, y, z).texture(u, v).next(); + buffer.pos(x, y, z).tex(u, v).endVertex(); //#else //$$ buffer.addVertexWithUV(x, y, z, u, v); //#endif @@ -283,7 +283,7 @@ private static void BufferBuilder_addPosTex(BufferBuilder buffer, double x, doub @Pattern private static void BufferBuilder_beginPosTexCol(BufferBuilder buffer, int mode) { //#if MC>=10809 - buffer.begin(mode, VertexFormats.POSITION_TEXTURE_COLOR); + buffer.begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR); //#else //$$ buffer.startDrawing(mode /* POSITION_TEXTURE_COLOR */); //#endif @@ -292,7 +292,7 @@ private static void BufferBuilder_beginPosTexCol(BufferBuilder buffer, int mode) @Pattern private static void BufferBuilder_addPosTexCol(BufferBuilder buffer, double x, double y, double z, float u, float v, int r, int g, int b, int a) { //#if MC>=10809 - buffer.vertex(x, y, z).texture(u, v).color(r, g, b, a).next(); + buffer.pos(x, y, z).tex(u, v).color(r, g, b, a).endVertex(); //#else //$$ { WorldRenderer $buffer = buffer; double $x = x; double $y = y; double $z = z; float $u = u; float $v = v; $buffer.setColorRGBA(r, g, b, a); $buffer.addVertexWithUV($x, $y, $z, $u, $v); } //#endif @@ -308,43 +308,43 @@ private static Tessellator Tessellator_getInstance() { } @Pattern - private static EntityRenderDispatcher getEntityRenderDispatcher(MinecraftClient mc) { + private static EntityRendererManager getEntityRenderDispatcher(Minecraft mc) { //#if MC>=10800 - return mc.getEntityRenderDispatcher(); + return mc.getRenderManager(); //#else //$$ return com.replaymod.core.versions.MCVer.getRenderManager(mc); //#endif } @Pattern - private static float getCameraYaw(EntityRenderDispatcher dispatcher) { + private static float getCameraYaw(EntityRendererManager dispatcher) { //#if MC>=11500 - return dispatcher.camera.getYaw(); + return dispatcher.info.getYaw(); //#else //$$ return dispatcher.cameraYaw; //#endif } @Pattern - private static float getCameraPitch(EntityRenderDispatcher dispatcher) { + private static float getCameraPitch(EntityRendererManager dispatcher) { //#if MC>=11500 - return dispatcher.camera.getPitch(); + return dispatcher.info.getPitch(); //#else //$$ return dispatcher.cameraPitch; //#endif } @Pattern - private static float getRenderPartialTicks(MinecraftClient mc) { + private static float getRenderPartialTicks(Minecraft mc) { //#if MC>=10900 - return mc.getTickDelta(); + return mc.getRenderPartialTicks(); //#else //$$ return ((com.replaymod.core.mixin.MinecraftAccessor) mc).getTimer().renderPartialTicks; //#endif } @Pattern - private static TextureManager getTextureManager(MinecraftClient mc) { + private static TextureManager getTextureManager(Minecraft mc) { //#if MC>=11400 return mc.getTextureManager(); //#else @@ -355,7 +355,7 @@ private static TextureManager getTextureManager(MinecraftClient mc) { @Pattern private static String getBoundKeyName(KeyBinding keyBinding) { //#if MC>=11600 - return keyBinding.getBoundKeyLocalizedText().getString(); + return keyBinding.func_238171_j_().getString(); //#elseif MC>=11400 //$$ return keyBinding.getLocalizedName(); //#else @@ -364,9 +364,9 @@ private static String getBoundKeyName(KeyBinding keyBinding) { } @Pattern - private static PositionedSoundInstance master(Identifier sound, float pitch) { + private static SimpleSound master(ResourceLocation sound, float pitch) { //#if MC>=10900 - return PositionedSoundInstance.master(new SoundEvent(sound), pitch); + return SimpleSound.master(new SoundEvent(sound), pitch); //#elseif MC>=10800 //$$ return PositionedSoundRecord.create(sound, pitch); //#else @@ -377,7 +377,7 @@ private static PositionedSoundInstance master(Identifier sound, float pitch) { @Pattern private static boolean isKeyBindingConflicting(KeyBinding a, KeyBinding b) { //#if MC>=10900 - return a.equals(b); + return a.conflicts(b); //#else //$$ return (a.getKeyCode() == b.getKeyCode()); //#endif diff --git a/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java b/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java index c690defc..55a22bf1 100644 --- a/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java +++ b/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java @@ -1 +1,65 @@ -// Forge only +package com.replaymod.core.versions.forge; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.replaymod.core.events.*; +import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.replay.events.RenderHotbarCallback; +import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.RenderHandEvent; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +public class EventsAdapter extends EventRegistrations { + @SubscribeEvent + public void onKeyEvent(InputEvent.KeyInputEvent event) { + KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); + } + + @SubscribeEvent + public void onMouseInput(InputEvent.MouseInputEvent event) { + KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); + } + + @SubscribeEvent + public void preRender(TickEvent.RenderTickEvent event) { + if (event.phase != TickEvent.Phase.START) return; + PreRenderCallback.EVENT.invoker().preRender(); + } + + @SubscribeEvent + public void postRender(TickEvent.RenderTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + PostRenderCallback.EVENT.invoker().postRender(); + } + + @SubscribeEvent + public void renderCameraPath(RenderWorldLastEvent event) { + PostRenderWorldCallback.EVENT.invoker().postRenderWorld(new MatrixStack()); + } + + @SubscribeEvent + public void oRenderHand(RenderHandEvent event) { + if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) { + event.setCanceled(true); + } + } + + @SubscribeEvent + public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) { + Boolean result = null; + switch (event.getType()) { + case CROSSHAIRS: + result = RenderSpectatorCrosshairCallback.EVENT.invoker().shouldRenderSpectatorCrosshair(); + break; + case HOTBAR: + result = RenderHotbarCallback.EVENT.invoker().shouldRenderHotbar(); + break; + } + if (result == Boolean.FALSE) { + event.setCanceled(true); + } + } +} diff --git a/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java b/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java index 98945492..b2b495d5 100644 --- a/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java +++ b/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java @@ -1,23 +1,23 @@ package com.replaymod.core.versions.scheduler; import com.replaymod.mixin.MinecraftAccessor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.util.crash.CrashException; -import net.minecraft.util.thread.ReentrantThreadExecutor; +import net.minecraft.client.Minecraft; +import net.minecraft.crash.ReportedException; +import net.minecraft.util.concurrent.RecursiveEventLoop; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class SchedulerImpl implements Scheduler { - private static final MinecraftClient mc = MinecraftClient.getInstance(); + private static final Minecraft mc = Minecraft.getInstance(); @Override public void runSync(Runnable runnable) throws InterruptedException, ExecutionException, TimeoutException { - if (mc.isOnThread()) { + if (mc.isOnExecutionThread()) { runnable.run(); } else { - executor.submit(() -> { + executor.supplyAsync(() -> { runnable.run(); return null; }).get(30, TimeUnit.SECONDS); @@ -29,7 +29,7 @@ public void runPostStartup(Runnable runnable) { runLater(new Runnable() { @Override public void run() { - if (mc.overlay != null) { + if (mc.loadingGui != null) { // delay until after resources have been loaded runLater(this); return; @@ -51,7 +51,7 @@ public void run() { // stuff submitted via runLater is actually always run (e.g. recording might not be fully stopped because parts // of that are run via runLater and stopping the recording happens right around the time MC clears the queue). // Luckily, that's also the version where MC pulled out the executor implementation, so we can just spin up our own. - public static class ReplayModExecutor extends ReentrantThreadExecutor { + public static class ReplayModExecutor extends RecursiveEventLoop { private final Thread mcThread = Thread.currentThread(); private ReplayModExecutor(String string_1) { @@ -59,30 +59,30 @@ private ReplayModExecutor(String string_1) { } @Override - protected Runnable createTask(Runnable runnable) { + protected Runnable wrapTask(Runnable runnable) { return runnable; } @Override - protected boolean canExecute(Runnable runnable) { + protected boolean canRun(Runnable runnable) { return true; } @Override - protected Thread getThread() { + protected Thread getExecutionThread() { return mcThread; } @Override - public void runTasks() { - super.runTasks(); + public void drainTasks() { + super.drainTasks(); } } public final ReplayModExecutor executor = new ReplayModExecutor("Client/ReplayMod"); @Override public void runTasks() { - executor.runTasks(); + executor.drainTasks(); } @Override @@ -97,7 +97,7 @@ public void runLater(Runnable runnable) { } private void runLater(Runnable runnable, Runnable defer) { - if (mc.isOnThread() && inRunLater && !inRenderTaskQueue) { + if (mc.isOnExecutionThread() && inRunLater && !inRenderTaskQueue) { ((MinecraftAccessor) mc).getRenderTaskQueue().offer(() -> { inRenderTaskQueue = true; try { @@ -107,14 +107,14 @@ private void runLater(Runnable runnable, Runnable defer) { } }); } else { - executor.send(() -> { + executor.enqueue(() -> { inRunLater = true; try { runnable.run(); - } catch (CrashException e) { + } catch (ReportedException e) { e.printStackTrace(); - System.err.println(e.getReport().asString()); - mc.setCrashReport(e.getReport()); + System.err.println(e.getCrashReport().getCompleteReport()); + mc.crashed(e.getCrashReport()); } finally { inRunLater = false; } diff --git a/src/main/java/com/replaymod/editor/gui/GuiEditReplay.java b/src/main/java/com/replaymod/editor/gui/GuiEditReplay.java index a1df93a6..578c1cd2 100644 --- a/src/main/java/com/replaymod/editor/gui/GuiEditReplay.java +++ b/src/main/java/com/replaymod/editor/gui/GuiEditReplay.java @@ -20,7 +20,7 @@ import com.replaymod.gui.popup.AbstractGuiPopup; import de.johni0702.minecraft.gui.utils.lwjgl.Color; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.crash.CrashReport; import java.io.IOException; import java.nio.file.Path; @@ -151,7 +151,7 @@ private void apply() { replayFile.writeMarkers(markers); replayFile.save(); } catch (IOException e) { - Utils.error(ReplayModEditor.LOGGER, this, CrashReport.create(e, "Writing markers"), this::close); + Utils.error(ReplayModEditor.LOGGER, this, CrashReport.makeCrashReport(e, "Writing markers"), this::close); } try { @@ -163,7 +163,7 @@ private void apply() { }); } catch (Throwable e) { e.printStackTrace(); // in case runLater fails - CrashReport crashReport = CrashReport.create(e, "Running marker processor"); + CrashReport crashReport = CrashReport.makeCrashReport(e, "Running marker processor"); ReplayMod.instance.runLater(() -> Utils.error(ReplayModEditor.LOGGER, this, crashReport, () -> { progressPopup.close(); close(); diff --git a/src/main/java/com/replaymod/editor/handler/GuiHandler.java b/src/main/java/com/replaymod/editor/handler/GuiHandler.java index 3776ab79..f9a88ce4 100644 --- a/src/main/java/com/replaymod/editor/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/editor/handler/GuiHandler.java @@ -9,7 +9,7 @@ import com.replaymod.gui.element.GuiButton; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.InitScreenCallback; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.crash.CrashReport; import java.io.IOException; @@ -34,7 +34,7 @@ protected void close() { } }.open(); } catch (IOException e) { - Utils.error(ReplayModEditor.LOGGER, replayViewer, CrashReport.create(e, "Opening replay editor"), () -> {}); + Utils.error(ReplayModEditor.LOGGER, replayViewer, CrashReport.makeCrashReport(e, "Opening replay editor"), () -> {}); } }).setSize(73, 20).setI18nLabel("replaymod.gui.edit").setDisabled()); } diff --git a/src/main/java/com/replaymod/extras/FullBrightness.java b/src/main/java/com/replaymod/extras/FullBrightness.java index b99e5cbf..b8bdd886 100644 --- a/src/main/java/com/replaymod/extras/FullBrightness.java +++ b/src/main/java/com/replaymod/extras/FullBrightness.java @@ -12,16 +12,16 @@ import com.replaymod.gui.element.IGuiImage; import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.utils.EventRegistrations; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.client.Minecraft; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Effects; public class FullBrightness extends EventRegistrations implements Extra { private ReplayMod core; private ReplayModReplay module; private IGuiImage indicator; - private MinecraftClient mc; + private Minecraft mc; private boolean active; //#if MC>=11400 private double originalGamma; @@ -71,12 +71,12 @@ private void preRender() { if (active && module.getReplayHandler() != null) { Type type = getType(); if (type == Type.Gamma || type == Type.Both) { - originalGamma = mc.options.gamma; - mc.options.gamma = 1000; + originalGamma = mc.gameSettings.gamma; + mc.gameSettings.gamma = 1000; } if (type == Type.NightVision || type == Type.Both) { if (mc.player != null) { - mc.player.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION + mc.player.addPotionEffect(new EffectInstance(Effects.NIGHT_VISION //#if MC<=10809 //$$ .id //#endif @@ -91,11 +91,11 @@ private void postRender() { if (active && module.getReplayHandler() != null) { Type type = getType(); if (type == Type.Gamma || type == Type.Both) { - mc.options.gamma = originalGamma; + mc.gameSettings.gamma = originalGamma; } if (type == Type.NightVision || type == Type.Both) { if (mc.player != null) { - mc.player.removeStatusEffect(StatusEffects.NIGHT_VISION + mc.player.removePotionEffect(Effects.NIGHT_VISION //#if MC<=10809 //$$ .id //#endif diff --git a/src/main/java/com/replaymod/extras/HotkeyButtons.java b/src/main/java/com/replaymod/extras/HotkeyButtons.java index 4493d1ab..ae4d7997 100644 --- a/src/main/java/com/replaymod/extras/HotkeyButtons.java +++ b/src/main/java/com/replaymod/extras/HotkeyButtons.java @@ -17,7 +17,7 @@ import com.replaymod.gui.utils.EventRegistrations; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; import java.util.Collection; import java.util.Collections; @@ -66,7 +66,7 @@ public Map getElements() { final KeyBindingRegistry keyBindingRegistry = mod.getKeyBindingRegistry(); keyBindingRegistry.getBindings().values().stream() - .sorted(Comparator.comparing(it -> I18n.translate(it.name))) + .sorted(Comparator.comparing(it -> I18n.format(it.name))) .forEachOrdered(keyBinding -> { GuiButton button = new GuiButton(){ @Override @@ -76,8 +76,8 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render if (keyBinding.supportsAutoActivation()) { setTooltip(new GuiTooltip().setText(new String[]{ - I18n.translate("replaymod.gui.ingame.autoactivating"), - I18n.translate("replaymod.gui.ingame.autoactivating." + I18n.format("replaymod.gui.ingame.autoactivating"), + I18n.format("replaymod.gui.ingame.autoactivating." + (keyBinding.isAutoActivating() ? "disable" : "enable")), })); setLabelColor(keyBinding.isAutoActivating() ? 0x00ff00 : 0xe0e0e0); diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java index 8dae3ef6..5cef3c33 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java @@ -10,7 +10,7 @@ import com.replaymod.gui.function.Loadable; import com.replaymod.gui.layout.GridLayout; import com.replaymod.gui.layout.VerticalLayout; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.crash.CrashReport; import java.io.File; import java.nio.file.Path; @@ -63,7 +63,7 @@ public GuiCreateScreenshot(ReplayMod mod) { } } catch (Throwable t) { - error(LOGGER, GuiCreateScreenshot.this, CrashReport.create(t, "Rendering video"), () -> {}); + error(LOGGER, GuiCreateScreenshot.this, CrashReport.makeCrashReport(t, "Rendering video"), () -> {}); getScreen().display(); // Re-show the render settings gui and the new error popup } }); @@ -84,7 +84,7 @@ public void open() { @Override public void close() { super.close(); - getMinecraft().openScreen(null); + getMinecraft().displayGuiScreen(null); } @Override @@ -96,7 +96,7 @@ public void load() { @Override protected File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) { DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); - File screenshotFolder = new File(getMinecraft().runDirectory, "screenshots"); + File screenshotFolder = new File(getMinecraft().gameDir, "screenshots"); screenshotFolder.mkdirs(); String baseName = DATE_FORMAT.format(new Date()); for (int i = 1; ; i++) { @@ -114,6 +114,6 @@ public void load(RenderSettings settings) { @Override protected Path getSettingsPath() { - return getMinecraft().runDirectory.toPath().resolve("config/replaymod-screenshotsettings.json"); + return getMinecraft().gameDir.toPath().resolve("config/replaymod-screenshotsettings.json"); } } diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java index 0f38c79d..fac552fc 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java @@ -8,15 +8,15 @@ import com.replaymod.render.rendering.Pipelines; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.Window; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.client.Minecraft; +import net.minecraft.client.MainWindow; +import net.minecraft.crash.CrashReport; import static com.replaymod.core.versions.MCVer.resizeMainWindow; public class ScreenshotRenderer implements RenderInfo { - private final MinecraftClient mc = MCVer.getMinecraft(); + private final Minecraft mc = MCVer.getMinecraft(); private final RenderSettings settings; @@ -28,11 +28,11 @@ public ScreenshotRenderer(RenderSettings settings) { public boolean renderScreenshot() throws Throwable { try { - Window window = mc.getWindow(); + MainWindow window = mc.getMainWindow(); int widthBefore = window.getFramebufferWidth(); int heightBefore = window.getFramebufferHeight(); - boolean hideGUIBefore = mc.options.hudHidden; - mc.options.hudHidden = true; + boolean hideGUIBefore = mc.gameSettings.hideGUI; + mc.gameSettings.hideGUI = true; ForceChunkLoadingHook clrg = new ForceChunkLoadingHook(mc.worldRenderer); @@ -46,13 +46,13 @@ public boolean renderScreenshot() throws Throwable { clrg.uninstall(); - mc.options.hudHidden = hideGUIBefore; + mc.gameSettings.hideGUI = hideGUIBefore; resizeMainWindow(mc, widthBefore, heightBefore); return true; } catch (OutOfMemoryError e) { e.printStackTrace(); - CrashReport report = CrashReport.create(e, "Creating Equirectangular Screenshot"); - MCVer.getMinecraft().setCrashReport(report); + CrashReport report = CrashReport.makeCrashReport(e, "Creating Equirectangular Screenshot"); + MCVer.getMinecraft().crashed(report); } return false; } @@ -76,7 +76,7 @@ public int getTotalFrames() { @Override public float updateForNextFrame() { framesDone++; - return mc.getTickDelta(); + return mc.getRenderPartialTicks(); } @Override diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java index 748c4ab1..612e02cf 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java @@ -10,7 +10,7 @@ import com.replaymod.replay.ReplayModReplay; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.Image; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.crash.CrashReport; import java.io.File; import java.io.IOException; @@ -48,10 +48,10 @@ public void consume(Map channels) { img.writePNG(outputFile); } catch (OutOfMemoryError e) { e.printStackTrace(); - CrashReport report = CrashReport.create(e, "Exporting frame"); - MCVer.getMinecraft().setCrashReport(report); + CrashReport report = CrashReport.makeCrashReport(e, "Exporting frame"); + MCVer.getMinecraft().crashed(report); } catch (Throwable t) { - CrashReport report = CrashReport.create(t, "Exporting frame"); + CrashReport report = CrashReport.makeCrashReport(t, "Exporting frame"); ReplayMod.instance.runLater(() -> Utils.error(ReplayModExtras.LOGGER, ReplayModReplay.instance.getReplayHandler().getOverlay(), diff --git a/src/main/java/com/replaymod/extras/modcore/ModCoreInstaller.java b/src/main/java/com/replaymod/extras/modcore/ModCoreInstaller.java index 40615608..a8a0fa99 100644 --- a/src/main/java/com/replaymod/extras/modcore/ModCoreInstaller.java +++ b/src/main/java/com/replaymod/extras/modcore/ModCoreInstaller.java @@ -52,7 +52,7 @@ import java.util.List; //#if FABRIC>=1 -import net.fabricmc.loader.api.FabricLoader; +//$$ import net.fabricmc.loader.api.FabricLoader; //#else //#if MC>=11400 //#else diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java index 7d8a5b5a..d0cb80fb 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java @@ -117,8 +117,8 @@ private void onReplayClose(ReplayHandler replayHandler) { { on(PreRenderHandCallback.EVENT, this::shouldHideHand); } private boolean shouldHideHand() { - Entity view = module.getCore().getMinecraft().getCameraEntity(); - return view != null && isHidden(view.getUuid()); + Entity view = module.getCore().getMinecraft().getRenderViewEntity(); + return view != null && isHidden(view.getUniqueID()); } // See MixinRender for why this is 1.7.10 only diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java index 5446070b..a5198ad7 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java @@ -21,16 +21,16 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.Identifier; +import net.minecraft.util.ResourceLocation; //#if MC>=10904 -import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.potion.Effects; //#else //$$ import net.minecraft.potion.Potion; //#endif //#if MC>=10800 -import net.minecraft.client.render.entity.PlayerModelPart; +import net.minecraft.entity.player.PlayerModelPart; //#endif import java.util.Collections; @@ -94,7 +94,7 @@ public PlayerOverviewGui(final PlayerOverview extra, List players) Collections.sort(players, new PlayerComparator()); // Sort by name, spectators last for (final PlayerEntity p : players) { - final Identifier texture = Utils.getResourceLocationForPlayerUUID(p.getUuid()); + final ResourceLocation texture = Utils.getResourceLocationForPlayerUUID(p.getUniqueID()); final GuiClickable panel = new GuiClickable().setLayout(new HorizontalLayout().setSpacing(2)).addElements( new HorizontalLayout.Data(0.5), new GuiImage() { @Override @@ -102,7 +102,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render renderer.bindTexture(texture); renderer.drawTexturedRect(0, 0, 8, 8, 16, 16, 8, 8, 64, 64); //#if MC>=10809 - if (p.isPartVisible(PlayerModelPart.HAT)) { + if (p.isWearing(PlayerModelPart.HAT)) { //#else //#if MC>=10800 //$$ if (p.func_175148_a(EnumPlayerModelParts.HAT)) { @@ -116,7 +116,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render }.setSize(16, 16), new GuiLabel().setText( //#if MC>=11400 - p.getName().asString() + p.getName().getUnformattedComponentText() //#else //#if MC>=10800 //$$ p.getName() @@ -134,10 +134,10 @@ public void run() { final GuiCheckbox checkbox = new GuiCheckbox() { @Override public GuiCheckbox setChecked(boolean checked) { - extra.setHidden(p.getUuid(), !checked); + extra.setHidden(p.getUniqueID(), !checked); return super.setChecked(checked); } - }.setChecked(!extra.isHidden(p.getUuid())); + }.setChecked(!extra.isHidden(p.getUniqueID())); new GuiPanel(playersScrollable.getListPanel()).setLayout(new CustomLayout() { @Override protected void layout(GuiPanel container, int width, int height) { @@ -169,7 +169,7 @@ public void close() { private static boolean isSpectator(PlayerEntity e) { //#if MC>=10904 - return e.isInvisible() && e.getStatusEffect(StatusEffects.INVISIBILITY) == null; + return e.isInvisible() && e.getActivePotionEffect(Effects.INVISIBILITY) == null; //#else //$$ return e.isInvisible() && e.getActivePotionEffect(Potion.invisibility) == null; //#endif @@ -181,7 +181,7 @@ public int compare(PlayerEntity o1, PlayerEntity o2) { if (isSpectator(o1) && !isSpectator(o2)) return 1; if (isSpectator(o2) && !isSpectator(o1)) return -1; //#if MC>=11400 - return o1.getName().asString().compareToIgnoreCase(o2.getName().asString()); + return o1.getName().getUnformattedComponentText().compareToIgnoreCase(o2.getName().getUnformattedComponentText()); //#else //#if MC>=10800 //$$ return o1.getName().compareToIgnoreCase(o2.getName()); diff --git a/src/main/java/com/replaymod/extras/youtube/GuiYoutubeUpload.java b/src/main/java/com/replaymod/extras/youtube/GuiYoutubeUpload.java index 52da500b..710bea47 100644 --- a/src/main/java/com/replaymod/extras/youtube/GuiYoutubeUpload.java +++ b/src/main/java/com/replaymod/extras/youtube/GuiYoutubeUpload.java @@ -22,7 +22,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.Image; import joptsimple.internal.Strings; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; import org.apache.commons.io.IOUtils; //#if MC>=11400 @@ -80,7 +80,7 @@ public void run() { public final GuiTextArea descriptionField = new GuiTextArea().setMaxCharCount(Integer.MAX_VALUE) .setMaxTextWidth(Integer.MAX_VALUE).setMaxTextHeight(Integer.MAX_VALUE); { - descriptionField.setText(new String[]{I18n.translate("replaymod.gui.videodescription")}); + descriptionField.setText(new String[]{I18n.format("replaymod.gui.videodescription")}); } public final com.replaymod.gui.element.GuiTextField tagsField = new GuiTextField().setI18nHint("replaymod.gui.videotags"); @@ -216,7 +216,7 @@ public void onSuccess(Video result) { LOGGER.error("Failed to open video URL \"{}\":", url, throwable); } upload = null; - progressBar.setLabel(I18n.translate("replaymod.gui.ytuploadprogress.done", url)); + progressBar.setLabel(I18n.format("replaymod.gui.ytuploadprogress.done", url)); setState(false); } diff --git a/src/main/java/com/replaymod/extras/youtube/VideoVisibility.java b/src/main/java/com/replaymod/extras/youtube/VideoVisibility.java index e2c5cffc..c961b769 100644 --- a/src/main/java/com/replaymod/extras/youtube/VideoVisibility.java +++ b/src/main/java/com/replaymod/extras/youtube/VideoVisibility.java @@ -1,12 +1,12 @@ package com.replaymod.extras.youtube; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; public enum VideoVisibility { PUBLIC, UNLISTED, PRIVATE; @Override public String toString() { - return I18n.translate("replaymod.gui.videovisibility." + name().toLowerCase()); + return I18n.format("replaymod.gui.videovisibility." + name().toLowerCase()); } } diff --git a/src/main/java/com/replaymod/extras/youtube/YoutubeUploader.java b/src/main/java/com/replaymod/extras/youtube/YoutubeUploader.java index 1ea0f466..3309aa1a 100644 --- a/src/main/java/com/replaymod/extras/youtube/YoutubeUploader.java +++ b/src/main/java/com/replaymod/extras/youtube/YoutubeUploader.java @@ -27,7 +27,7 @@ import com.replaymod.render.RenderSettings; import com.replaymod.render.metadata.MetadataInjector; import com.replaymod.gui.utils.NonNull; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import org.apache.commons.exec.CommandLine; import org.apache.commons.io.FileUtils; @@ -63,7 +63,7 @@ public class YoutubeUploader { private volatile boolean cancelled; - public YoutubeUploader(MinecraftClient minecraft, File videoFile, int videoFrames, + public YoutubeUploader(Minecraft minecraft, File videoFile, int videoFrames, String thumbnailFormat, byte[] thumbnailImage, RenderSettings settings, VideoVisibility videoVisibility, VideoSnippet videoSnippet) throws GeneralSecurityException, IOException { @@ -75,7 +75,7 @@ public YoutubeUploader(MinecraftClient minecraft, File videoFile, int videoFrame this.videoVisibility = videoVisibility; this.videoSnippet = videoSnippet; this.httpTransport = GoogleNetHttpTransport.newTrustedTransport(); - this.dataStoreFactory = new FileDataStoreFactory(minecraft.runDirectory); + this.dataStoreFactory = new FileDataStoreFactory(minecraft.gameDir); } diff --git a/src/main/java/com/replaymod/gui/GuiRenderer.java b/src/main/java/com/replaymod/gui/GuiRenderer.java index aaaff5cf..9c753524 100644 --- a/src/main/java/com/replaymod/gui/GuiRenderer.java +++ b/src/main/java/com/replaymod/gui/GuiRenderer.java @@ -27,8 +27,8 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.util.ResourceLocation; public interface GuiRenderer { @@ -40,7 +40,7 @@ public interface GuiRenderer { void setDrawingArea(int x, int y, int width, int height); - void bindTexture(Identifier location); + void bindTexture(ResourceLocation location); void bindTexture(int glId); diff --git a/src/main/java/com/replaymod/gui/MinecraftGuiRenderer.java b/src/main/java/com/replaymod/gui/MinecraftGuiRenderer.java index e9ac6e68..d848521c 100644 --- a/src/main/java/com/replaymod/gui/MinecraftGuiRenderer.java +++ b/src/main/java/com/replaymod/gui/MinecraftGuiRenderer.java @@ -31,11 +31,11 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.AbstractGui; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; //#if MC>=10800 @@ -50,8 +50,8 @@ public class MinecraftGuiRenderer implements GuiRenderer { - private final DrawableHelper gui = new DrawableHelper(){}; - private final MinecraftClient mc = com.replaymod.gui.versions.MCVer.getMinecraft(); + private final AbstractGui gui = new AbstractGui(){}; + private final Minecraft mc = com.replaymod.gui.versions.MCVer.getMinecraft(); private final MatrixStack matrixStack; @@ -59,7 +59,7 @@ public class MinecraftGuiRenderer implements GuiRenderer { //#if MC>=11400 private final int scaledWidth = com.replaymod.gui.versions.MCVer.newScaledResolution(mc).getScaledWidth(); private final int scaledHeight = com.replaymod.gui.versions.MCVer.newScaledResolution(mc).getScaledHeight(); - private final double scaleFactor = com.replaymod.gui.versions.MCVer.newScaledResolution(mc).getScaleFactor(); + private final double scaleFactor = com.replaymod.gui.versions.MCVer.newScaledResolution(mc).getGuiScaleFactor(); //#else //$$ private final int scaledWidth = newScaledResolution(mc).getScaledWidth(); //$$ private final int scaledHeight = newScaledResolution(mc).getScaledHeight(); @@ -110,7 +110,7 @@ public void setDrawingArea(int x, int y, int width, int height) { } @Override - public void bindTexture(Identifier location) { + public void bindTexture(ResourceLocation location) { //#if MC>=11500 com.replaymod.gui.versions.MCVer.getMinecraft().getTextureManager().bindTexture(location); //#else @@ -130,7 +130,7 @@ public void bindTexture(int glId) { @Override public void drawTexturedRect(int x, int y, int u, int v, int width, int height) { //#if MC>=11600 - gui.drawTexture(matrixStack, x, y, u, v, width, height); + gui.blit(matrixStack, x, y, u, v, width, height); //#else //#if MC>=11400 //$$ gui.blit(x, y, u, v, width, height); @@ -144,7 +144,7 @@ public void drawTexturedRect(int x, int y, int u, int v, int width, int height) public void drawTexturedRect(int x, int y, int u, int v, int width, int height, int uWidth, int vHeight, int textureWidth, int textureHeight) { color(1, 1, 1); //#if MC>=11600 - DrawableHelper.drawTexture(matrixStack, x, y, width, height, u, v, uWidth, vHeight, textureWidth, textureHeight); + AbstractGui.blit(matrixStack, x, y, width, height, u, v, uWidth, vHeight, textureWidth, textureHeight); //#else //#if MC>=11400 //$$ DrawableHelper.blit(x, y, width, height, u, v, uWidth, vHeight, textureWidth, textureHeight); @@ -156,7 +156,7 @@ public void drawTexturedRect(int x, int y, int u, int v, int width, int height, @Override public void drawRect(int x, int y, int width, int height, int color) { - DrawableHelper.fill( + AbstractGui.fill( //#if MC>=11600 matrixStack, //#endif @@ -210,16 +210,16 @@ public int drawCenteredString(int x, int y, ReadableColor color, String text) { @Override public int drawString(int x, int y, int color, String text, boolean shadow) { - TextRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); + FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); try { if (shadow) { - return fontRenderer.drawWithShadow( + return fontRenderer.drawStringWithShadow( //#if MC>=11600 matrixStack, //#endif text, x, y, color); } else { - return fontRenderer.draw( + return fontRenderer.drawString( //#if MC>=11600 matrixStack, //#endif @@ -237,8 +237,8 @@ public int drawString(int x, int y, ReadableColor color, String text, boolean sh @Override public int drawCenteredString(int x, int y, int color, String text, boolean shadow) { - TextRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); - x-=fontRenderer.getWidth(text) / 2; + FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); + x-=fontRenderer.getStringWidth(text) / 2; return drawString(x, y, color, text, shadow); } diff --git a/src/main/java/com/replaymod/gui/OffsetGuiRenderer.java b/src/main/java/com/replaymod/gui/OffsetGuiRenderer.java index 4dcc61de..3ab381a3 100644 --- a/src/main/java/com/replaymod/gui/OffsetGuiRenderer.java +++ b/src/main/java/com/replaymod/gui/OffsetGuiRenderer.java @@ -29,8 +29,8 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; public class OffsetGuiRenderer implements com.replaymod.gui.GuiRenderer { @@ -132,7 +132,7 @@ public void stopUsing() { } @Override - public void bindTexture(Identifier location) { + public void bindTexture(ResourceLocation location) { renderer.bindTexture(location); } diff --git a/src/main/java/com/replaymod/gui/RenderInfo.java b/src/main/java/com/replaymod/gui/RenderInfo.java index a8062d1b..a3165c8d 100644 --- a/src/main/java/com/replaymod/gui/RenderInfo.java +++ b/src/main/java/com/replaymod/gui/RenderInfo.java @@ -25,8 +25,8 @@ package com.replaymod.gui; import com.replaymod.gui.versions.MCVer; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; import java.util.Objects; @@ -52,7 +52,7 @@ public RenderInfo layer(int layer) { } public void addTo(CrashReport crashReport) { - CrashReportSection category = crashReport.addElement("Render info details"); + CrashReportCategory category = crashReport.makeCategory("Render info details"); com.replaymod.gui.versions.MCVer.addDetail(category, "Partial Tick", () -> "" + partialTick); com.replaymod.gui.versions.MCVer.addDetail(category, "Mouse X", () -> "" + mouseX); com.replaymod.gui.versions.MCVer.addDetail(category, "Mouse Y", () -> "" + mouseY); diff --git a/src/main/java/com/replaymod/gui/container/AbstractGuiContainer.java b/src/main/java/com/replaymod/gui/container/AbstractGuiContainer.java index 9e1db7f7..aa88abab 100644 --- a/src/main/java/com/replaymod/gui/container/AbstractGuiContainer.java +++ b/src/main/java/com/replaymod/gui/container/AbstractGuiContainer.java @@ -38,9 +38,9 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import com.replaymod.gui.versions.MCVer; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; +import net.minecraft.crash.ReportedException; import org.apache.commons.lang3.tuple.Pair; import java.util.*; @@ -139,12 +139,12 @@ public void layout(ReadableDimension size, RenderInfo renderInfo) { try { layedOutElements = layout.layOut(this, size); } catch (Exception ex) { - CrashReport crashReport = CrashReport.create(ex, "Gui Layout"); + CrashReport crashReport = CrashReport.makeCrashReport(ex, "Gui Layout"); renderInfo.addTo(crashReport); - CrashReportSection category = crashReport.addElement("Gui container details"); + CrashReportCategory category = crashReport.makeCategory("Gui container details"); MCVer.addDetail(category, "Container", this::toString); MCVer.addDetail(category, "Layout", layout::toString); - throw new CrashException(crashReport); + throw new ReportedException(crashReport); } for (final Map.Entry> e : layedOutElements.entrySet()) { com.replaymod.gui.element.GuiElement element = e.getKey(); @@ -193,21 +193,21 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render .layer(renderInfo.getLayer() - e.getKey().getLayer())); eRenderer.stopUsing(); } catch (Exception ex) { - CrashReport crashReport = CrashReport.create(ex, "Rendering Gui"); + CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui"); renderInfo.addTo(crashReport); - CrashReportSection category = crashReport.addElement("Gui container details"); + CrashReportCategory category = crashReport.makeCategory("Gui container details"); MCVer.addDetail(category, "Container", this::toString); MCVer.addDetail(category, "Width", () -> "" + size.getWidth()); MCVer.addDetail(category, "Height", () -> "" + size.getHeight()); MCVer.addDetail(category, "Layout", layout::toString); - category = crashReport.addElement("Gui element details"); + category = crashReport.makeCategory("Gui element details"); MCVer.addDetail(category, "Element", () -> e.getKey().toString()); MCVer.addDetail(category, "Position", ePosition::toString); MCVer.addDetail(category, "Size", eSize::toString); if (e.getKey() instanceof com.replaymod.gui.container.GuiContainer) { MCVer.addDetail(category, "Layout", () -> ((GuiContainer) e.getKey()).getLayout().toString()); } - throw new CrashException(crashReport); + throw new ReportedException(crashReport); } } } diff --git a/src/main/java/com/replaymod/gui/container/AbstractGuiOverlay.java b/src/main/java/com/replaymod/gui/container/AbstractGuiOverlay.java index d7e1d857..8768305a 100644 --- a/src/main/java/com/replaymod/gui/container/AbstractGuiOverlay.java +++ b/src/main/java/com/replaymod/gui/container/AbstractGuiOverlay.java @@ -39,18 +39,18 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import com.replaymod.gui.versions.callbacks.PreTickCallback; import com.replaymod.gui.versions.callbacks.RenderHudCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; +import net.minecraft.client.Minecraft; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; +import net.minecraft.crash.ReportedException; //#if MC>=11400 -import net.minecraft.text.LiteralText; +import net.minecraft.util.text.StringTextComponent; //#endif //#if MC>=11400 -import net.minecraft.client.util.Window; +import net.minecraft.client.MainWindow; //#else //$$ import org.lwjgl.input.Mouse; //$$ import net.minecraft.client.gui.ScaledResolution; @@ -124,15 +124,15 @@ public void setAllowUserInput(boolean allowUserInput) { } private void updateUserInputGui() { - MinecraftClient mc = getMinecraft(); + Minecraft mc = getMinecraft(); if (visible) { if (mouseVisible) { if (mc.currentScreen == null) { - mc.openScreen(userInputGuiScreen); + mc.displayGuiScreen(userInputGuiScreen); } } else { if (mc.currentScreen == userInputGuiScreen) { - mc.openScreen(null); + mc.displayGuiScreen(null); } } } @@ -175,17 +175,17 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, position, tooltipSize); tooltip.draw(eRenderer, tooltipSize, renderInfo); } catch (Exception ex) { - CrashReport crashReport = CrashReport.create(ex, "Rendering Gui Tooltip"); + CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui Tooltip"); renderInfo.addTo(crashReport); - CrashReportSection category = crashReport.addElement("Gui container details"); + CrashReportCategory category = crashReport.makeCategory("Gui container details"); com.replaymod.gui.versions.MCVer.addDetail(category, "Container", this::toString); com.replaymod.gui.versions.MCVer.addDetail(category, "Width", () -> "" + size.getWidth()); com.replaymod.gui.versions.MCVer.addDetail(category, "Height", () -> "" + size.getHeight()); - category = crashReport.addElement("Tooltip details"); + category = crashReport.makeCategory("Tooltip details"); com.replaymod.gui.versions.MCVer.addDetail(category, "Element", tooltip::toString); com.replaymod.gui.versions.MCVer.addDetail(category, "Position", position::toString); com.replaymod.gui.versions.MCVer.addDetail(category, "Size", tooltipSize::toString); - throw new CrashException(crashReport); + throw new ReportedException(crashReport); } } } @@ -228,9 +228,9 @@ private void renderOverlay(MatrixStack stack, float partialTicks) { { on(PreTickCallback.EVENT, () -> invokeAll(com.replaymod.gui.function.Tickable.class, com.replaymod.gui.function.Tickable::tick)); } private void updateRenderer() { - MinecraftClient mc = getMinecraft(); + Minecraft mc = getMinecraft(); //#if MC>=11400 - Window + MainWindow //#else //$$ ScaledResolution //#endif @@ -247,7 +247,7 @@ protected class UserInputGuiScreen extends net.minecraft.client.gui.screen.Scree //#if MC>=11400 UserInputGuiScreen() { - super(new LiteralText("")); + super(new StringTextComponent("")); } //#endif @@ -376,16 +376,16 @@ public boolean mouseScrolled( //#if MC>=11400 @Override - public void onClose() { + public void closeScreen() { if (closeable) { - super.onClose(); + super.closeScreen(); } } //#endif @Override //#if MC>=11400 - public void removed() { + public void onClose() { //#else //$$ public void onGuiClosed() { //#endif diff --git a/src/main/java/com/replaymod/gui/container/AbstractGuiScreen.java b/src/main/java/com/replaymod/gui/container/AbstractGuiScreen.java index f6be5b1c..bb46bac3 100644 --- a/src/main/java/com/replaymod/gui/container/AbstractGuiScreen.java +++ b/src/main/java/com/replaymod/gui/container/AbstractGuiScreen.java @@ -36,10 +36,10 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; +import net.minecraft.crash.ReportedException; //#if MC>=11400 //#else @@ -111,7 +111,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render break; case DIRT: //#if MC>=11600 - wrapped.renderBackgroundTexture(0); + wrapped.renderDirtBackground(0); //#else //$$ wrapped.renderDirtBackground(0); //#endif @@ -145,17 +145,17 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, position, tooltipSize); tooltip.draw(eRenderer, tooltipSize, renderInfo); } catch (Exception ex) { - CrashReport crashReport = CrashReport.create(ex, "Rendering Gui Tooltip"); + CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui Tooltip"); renderInfo.addTo(crashReport); - CrashReportSection category = crashReport.addElement("Gui container details"); + CrashReportCategory category = crashReport.makeCategory("Gui container details"); com.replaymod.gui.versions.MCVer.addDetail(category, "Container", this::toString); com.replaymod.gui.versions.MCVer.addDetail(category, "Width", () -> "" + size.getWidth()); com.replaymod.gui.versions.MCVer.addDetail(category, "Height", () -> "" + size.getHeight()); - category = crashReport.addElement("Tooltip details"); + category = crashReport.makeCategory("Tooltip details"); com.replaymod.gui.versions.MCVer.addDetail(category, "Element", tooltip::toString); com.replaymod.gui.versions.MCVer.addDetail(category, "Position", position::toString); com.replaymod.gui.versions.MCVer.addDetail(category, "Size", tooltipSize::toString); - throw new CrashException(crashReport); + throw new ReportedException(crashReport); } } } @@ -179,7 +179,7 @@ public void setEnabledRepeatedKeyEvents(boolean enableRepeatKeyEvents) { } public void display() { - getMinecraft().openScreen(toMinecraft()); + getMinecraft().displayGuiScreen(toMinecraft()); } public Background getBackground() { @@ -374,7 +374,7 @@ public boolean mouseScrolled( @Override //#if MC>=11400 - public void removed() { + public void onClose() { //#else //$$ public void onGuiClosed() { //#endif diff --git a/src/main/java/com/replaymod/gui/container/VanillaGuiScreen.java b/src/main/java/com/replaymod/gui/container/VanillaGuiScreen.java index 70bc903b..3c6cf653 100644 --- a/src/main/java/com/replaymod/gui/container/VanillaGuiScreen.java +++ b/src/main/java/com/replaymod/gui/container/VanillaGuiScreen.java @@ -12,15 +12,15 @@ import com.replaymod.gui.versions.callbacks.OpenGuiScreenCallback; import com.replaymod.gui.versions.callbacks.PostRenderScreenCallback; import com.replaymod.gui.versions.callbacks.PreTickCallback; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.matrix.MatrixStack; //#if FABRIC>=1 -import com.replaymod.gui.versions.callbacks.KeyboardCallback; -import com.replaymod.gui.versions.callbacks.MouseCallback; +//$$ import com.replaymod.gui.versions.callbacks.KeyboardCallback; +//$$ import com.replaymod.gui.versions.callbacks.MouseCallback; //#elseif MC>=11600 -//$$ import net.minecraftforge.client.event.GuiScreenEvent; -//$$ import net.minecraftforge.eventbus.api.EventPriority; -//$$ import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; //#else //$$ import net.minecraftforge.client.event.GuiOpenEvent; //$$ import net.minecraftforge.client.event.GuiScreenEvent; @@ -89,7 +89,7 @@ public void register() { } public void display() { - getMinecraft().openScreen(mcScreen); + getMinecraft().displayGuiScreen(mcScreen); register(); } @@ -160,7 +160,7 @@ public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, b //#endif class EventHandler extends EventRegistrations //#if FABRIC>=1 - implements KeyboardCallback, MouseCallback + //$$ implements KeyboardCallback, MouseCallback //#endif { private boolean active; @@ -171,7 +171,7 @@ private void onGuiClosed() { if (active) { active = false; - getSuperMcGui().removed(); + getSuperMcGui().onClose(); WRAPPERS.remove(mcScreen, VanillaGuiScreen.this); } } @@ -181,7 +181,7 @@ private void preGuiInit(net.minecraft.client.gui.screen.Screen screen) { if (screen == mcScreen && active) { active = false; unregister(); - getSuperMcGui().removed(); + getSuperMcGui().onClose(); WRAPPERS.remove(mcScreen, VanillaGuiScreen.this); } } @@ -206,95 +206,95 @@ private void tickOverlay() { } //#if FABRIC>=1 - { on(MouseCallback.EVENT, this); } - - @Override - public boolean mouseDown(double x, double y, int button) { - return getSuperMcGui().mouseClicked(x, y, button); - } - - @Override - public boolean mouseDrag(double x, double y, int button, double dx, double dy) { - return getSuperMcGui().mouseDragged(x, y, button, dx, dy); - } - - @Override - public boolean mouseUp(double x, double y, int button) { - return getSuperMcGui().mouseReleased(x, y, button); - } - - @Override - public boolean mouseScroll(double x, double y, double scroll) { - return getSuperMcGui().mouseScrolled(x, y, scroll); - } - - { on(KeyboardCallback.EVENT, this); } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - return getSuperMcGui().keyPressed(keyCode, scanCode, modifiers); - } - - @Override - public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - return getSuperMcGui().keyReleased(keyCode, scanCode, modifiers); - } - - @Override - public boolean charTyped(char keyChar, int scanCode) { - return getSuperMcGui().charTyped(keyChar, scanCode); - } - //#elseif MC>11600 - //$$ private boolean handled; - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //$$ public void mouseClicked(GuiScreenEvent.MouseClickedEvent event) { - //$$ handled = getSuperMcGui().mouseClicked(event.getMouseX(), event.getMouseY(), event.getButton()); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } + //$$ { on(MouseCallback.EVENT, this); } + //$$ + //$$ @Override + //$$ public boolean mouseDown(double x, double y, int button) { + //$$ return getSuperMcGui().mouseClicked(x, y, button); //$$ } - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //$$ public void mouseDrag(GuiScreenEvent.MouseDragEvent event) { - //$$ handled = getSuperMcGui().mouseDragged(event.getMouseX(), event.getMouseY(), event.getMouseButton(), event.getDragX(), event.getDragY()); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } + //$$ + //$$ @Override + //$$ public boolean mouseDrag(double x, double y, int button, double dx, double dy) { + //$$ return getSuperMcGui().mouseDragged(x, y, button, dx, dy); //$$ } - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //$$ public void mouseClicked(GuiScreenEvent.MouseReleasedEvent event) { - //$$ handled = getSuperMcGui().mouseReleased(event.getMouseX(), event.getMouseY(), event.getButton()); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } + //$$ + //$$ @Override + //$$ public boolean mouseUp(double x, double y, int button) { + //$$ return getSuperMcGui().mouseReleased(x, y, button); //$$ } - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //$$ public void mouseClicked(GuiScreenEvent.MouseScrollEvent event) { - //$$ handled = getSuperMcGui().mouseScrolled(event.getMouseX(), event.getMouseY(), event.getScrollDelta()); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } + //$$ + //$$ @Override + //$$ public boolean mouseScroll(double x, double y, double scroll) { + //$$ return getSuperMcGui().mouseScrolled(x, y, scroll); //$$ } - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //$$ public void mouseClicked(GuiScreenEvent.KeyboardKeyPressedEvent event) { - //$$ handled = getSuperMcGui().keyPressed(event.getKeyCode(), event.getScanCode(), event.getModifiers()); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } + //$$ + //$$ { on(KeyboardCallback.EVENT, this); } + //$$ + //$$ @Override + //$$ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + //$$ return getSuperMcGui().keyPressed(keyCode, scanCode, modifiers); //$$ } - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //$$ public void mouseClicked(GuiScreenEvent.KeyboardKeyReleasedEvent event) { - //$$ handled = getSuperMcGui().keyReleased(event.getKeyCode(), event.getScanCode(), event.getModifiers()); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } + //$$ + //$$ @Override + //$$ public boolean keyReleased(int keyCode, int scanCode, int modifiers) { + //$$ return getSuperMcGui().keyReleased(keyCode, scanCode, modifiers); //$$ } - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //$$ public void mouseClicked(GuiScreenEvent.KeyboardCharTypedEvent event) { - //$$ handled = getSuperMcGui().charTyped(event.getCodePoint(), event.getModifiers()); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } + //$$ + //$$ @Override + //$$ public boolean charTyped(char keyChar, int scanCode) { + //$$ return getSuperMcGui().charTyped(keyChar, scanCode); //$$ } + //#elseif MC>11600 + private boolean handled; + @SubscribeEvent(priority = EventPriority.LOWEST) + public void mouseClicked(GuiScreenEvent.MouseClickedEvent event) { + handled = getSuperMcGui().mouseClicked(event.getMouseX(), event.getMouseY(), event.getButton()); + if (handled) { + event.setCanceled(true); + } + } + @SubscribeEvent(priority = EventPriority.LOWEST) + public void mouseDrag(GuiScreenEvent.MouseDragEvent event) { + handled = getSuperMcGui().mouseDragged(event.getMouseX(), event.getMouseY(), event.getMouseButton(), event.getDragX(), event.getDragY()); + if (handled) { + event.setCanceled(true); + } + } + @SubscribeEvent(priority = EventPriority.LOWEST) + public void mouseClicked(GuiScreenEvent.MouseReleasedEvent event) { + handled = getSuperMcGui().mouseReleased(event.getMouseX(), event.getMouseY(), event.getButton()); + if (handled) { + event.setCanceled(true); + } + } + @SubscribeEvent(priority = EventPriority.LOWEST) + public void mouseClicked(GuiScreenEvent.MouseScrollEvent event) { + handled = getSuperMcGui().mouseScrolled(event.getMouseX(), event.getMouseY(), event.getScrollDelta()); + if (handled) { + event.setCanceled(true); + } + } + @SubscribeEvent(priority = EventPriority.LOWEST) + public void mouseClicked(GuiScreenEvent.KeyboardKeyPressedEvent event) { + handled = getSuperMcGui().keyPressed(event.getKeyCode(), event.getScanCode(), event.getModifiers()); + if (handled) { + event.setCanceled(true); + } + } + @SubscribeEvent(priority = EventPriority.LOWEST) + public void mouseClicked(GuiScreenEvent.KeyboardKeyReleasedEvent event) { + handled = getSuperMcGui().keyReleased(event.getKeyCode(), event.getScanCode(), event.getModifiers()); + if (handled) { + event.setCanceled(true); + } + } + @SubscribeEvent(priority = EventPriority.LOWEST) + public void mouseClicked(GuiScreenEvent.KeyboardCharTypedEvent event) { + handled = getSuperMcGui().charTyped(event.getCodePoint(), event.getModifiers()); + if (handled) { + event.setCanceled(true); + } + } //#else //$$ private boolean handled; //$$ diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiButton.java b/src/main/java/com/replaymod/gui/element/AbstractGuiButton.java index 9c68472a..78af4d41 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiButton.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiButton.java @@ -33,20 +33,20 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import com.replaymod.gui.versions.MCVer; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.resources.I18n; +import net.minecraft.util.ResourceLocation; //#if MC>=11400 -import net.minecraft.client.sound.PositionedSoundInstance; +import net.minecraft.client.audio.SimpleSound; //#else //$$ import net.minecraft.client.audio.PositionedSoundRecord; //#endif //#if MC>=10904 -import net.minecraft.sound.SoundEvents; -import net.minecraft.sound.SoundEvent; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.SoundEvent; //#endif //#if MC>=10800 @@ -57,8 +57,8 @@ import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA; public abstract class AbstractGuiButton> extends AbstractGuiClickable implements Clickable, IGuiButton { - protected static final Identifier BUTTON_SOUND = new Identifier("gui.button.press"); - protected static final Identifier WIDGETS_TEXTURE = new Identifier("textures/gui/widgets.png"); + protected static final ResourceLocation BUTTON_SOUND = new ResourceLocation("gui.button.press"); + protected static final ResourceLocation WIDGETS_TEXTURE = new ResourceLocation("textures/gui/widgets.png"); //#if MC>=10904 private SoundEvent sound = SoundEvents.UI_BUTTON_CLICK; @@ -67,7 +67,7 @@ public abstract class AbstractGuiButton> extends private int labelColor = 0xe0e0e0; private String label; - private Identifier texture; + private ResourceLocation texture; private ReadableDimension textureSize; private ReadablePoint spriteUV; private ReadableDimension spriteSize; @@ -131,8 +131,8 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render @Override public ReadableDimension calcMinSize() { if (label != null) { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - return new Dimension(fontRenderer.getWidth(label), 20); + FontRenderer fontRenderer = MCVer.getFontRenderer(); + return new Dimension(fontRenderer.getStringWidth(label), 20); } else { return new Dimension(0, 0); } @@ -144,14 +144,14 @@ public void onClick() { super.onClick(); } - public static void playClickSound(MinecraftClient mc) { + public static void playClickSound(Minecraft mc) { //#if MC>=10904 playClickSound(mc, SoundEvents.UI_BUTTON_CLICK); } - public static void playClickSound(MinecraftClient mc, SoundEvent sound) { + public static void playClickSound(Minecraft mc, SoundEvent sound) { //#endif //#if MC>=11400 - mc.getSoundManager().play(PositionedSoundInstance.master(sound, 1.0F)); + mc.getSoundHandler().play(SimpleSound.master(sound, 1.0F)); //#else //#if MC>=10904 //$$ mc.getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(sound, 1.0F)); @@ -185,7 +185,7 @@ public SoundEvent getSound() { @Override public T setI18nLabel(String label, Object... args) { - return setLabel(I18n.translate(label, args)); + return setLabel(I18n.format(label, args)); } public String getLabel() { @@ -197,12 +197,12 @@ public void setLabelColor(int labelColor) { } @Override - public Identifier getTexture() { + public ResourceLocation getTexture() { return texture; } @Override - public T setTexture(Identifier texture) { + public T setTexture(ResourceLocation texture) { this.texture = texture; return getThis(); } diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiCheckbox.java b/src/main/java/com/replaymod/gui/element/AbstractGuiCheckbox.java index fb1bdf97..48051e49 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiCheckbox.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiCheckbox.java @@ -32,13 +32,13 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.util.Identifier; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.resources.I18n; +import net.minecraft.util.ResourceLocation; public abstract class AbstractGuiCheckbox> extends AbstractGuiClickable implements IGuiCheckbox { - protected static final Identifier BUTTON_SOUND = new Identifier("gui.button.press"); + protected static final ResourceLocation BUTTON_SOUND = new ResourceLocation("gui.button.press"); protected static final ReadableColor BOX_BACKGROUND_COLOR = new Color(46, 46, 46); private String label; @@ -74,9 +74,9 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render @Override public ReadableDimension calcMinSize() { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int height = fontRenderer.fontHeight + 2; - int width = height + 2 + fontRenderer.getWidth(label); + FontRenderer fontRenderer = MCVer.getFontRenderer(); + int height = fontRenderer.FONT_HEIGHT + 2; + int width = height + 2 + fontRenderer.getStringWidth(label); return new Dimension(width, height); } @@ -100,7 +100,7 @@ public T setLabel(String label) { @Override public T setI18nLabel(String label, Object... args) { - return setLabel(I18n.translate(label, args)); + return setLabel(I18n.format(label, args)); } @Override diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiElement.java b/src/main/java/com/replaymod/gui/element/AbstractGuiElement.java index fe486921..a7de1cc8 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiElement.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiElement.java @@ -31,14 +31,14 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.MCVer; -import net.minecraft.client.MinecraftClient; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.util.ResourceLocation; public abstract class AbstractGuiElement> implements com.replaymod.gui.element.GuiElement { - protected static final Identifier TEXTURE = new Identifier("jgui", "gui.png"); + protected static final ResourceLocation TEXTURE = new ResourceLocation("jgui", "gui.png"); - private final MinecraftClient minecraft = MCVer.getMinecraft(); + private final Minecraft minecraft = MCVer.getMinecraft(); private GuiContainer container; @@ -201,7 +201,7 @@ public ReadableDimension getMaxSize() { return maxSize == null ? new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE) : maxSize; } - public MinecraftClient getMinecraft() { + public Minecraft getMinecraft() { return this.minecraft; } diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiImage.java b/src/main/java/com/replaymod/gui/element/AbstractGuiImage.java index 997b957c..88acebda 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiImage.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiImage.java @@ -31,13 +31,13 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.Image; -import net.minecraft.client.texture.NativeImageBackedTexture; -import net.minecraft.util.Identifier; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.util.ResourceLocation; public abstract class AbstractGuiImage> extends AbstractGuiElement implements IGuiImage { - private NativeImageBackedTexture texture; - private Identifier resourceLocation; + private DynamicTexture texture; + private ResourceLocation resourceLocation; private int u, v; private int uWidth, vHeight; private int textureWidth, textureHeight; @@ -71,7 +71,7 @@ public AbstractGuiImage(AbstractGuiImage copyOf) { public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { super.draw(renderer, size, renderInfo); if (texture != null) { - renderer.bindTexture(texture.getGlId()); + renderer.bindTexture(texture.getGlTextureId()); } else { renderer.bindTexture(resourceLocation); } @@ -102,7 +102,7 @@ public T setTexture(Image img) { Preconditions.checkState(copyOf == null, "Cannot change texture of copy."); resourceLocation = null; if (texture != null) { - texture.clearGlId(); + texture.deleteGlTexture(); } texture = img.toTexture(); textureWidth = uWidth = img.getWidth(); @@ -111,10 +111,10 @@ public T setTexture(Image img) { } @Override - public T setTexture(Identifier resourceLocation) { + public T setTexture(ResourceLocation resourceLocation) { Preconditions.checkState(copyOf == null, "Cannot change texture of copy."); if (texture != null) { - texture.clearGlId(); + texture.deleteGlTexture(); texture = null; } this.resourceLocation = resourceLocation; @@ -123,7 +123,7 @@ public T setTexture(Identifier resourceLocation) { } @Override - public T setTexture(Identifier resourceLocation, int u, int v, int width, int height) { + public T setTexture(ResourceLocation resourceLocation, int u, int v, int width, int height) { setTexture(resourceLocation); setUV(u, v); setUVSize(width, height); @@ -171,15 +171,15 @@ public T setUVSize(int width, int height) { * alive after finalization when still unloading the texture. */ private static final class Finalizer implements Runnable { - private final NativeImageBackedTexture texture; + private final DynamicTexture texture; - public Finalizer(NativeImageBackedTexture texture) { + public Finalizer(DynamicTexture texture) { this.texture = texture; } @Override public void run() { - texture.clearGlId(); + texture.deleteGlTexture(); } } } diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiLabel.java b/src/main/java/com/replaymod/gui/element/AbstractGuiLabel.java index b3e75f73..b559ce6b 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiLabel.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiLabel.java @@ -31,16 +31,16 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.resources.I18n; import java.util.List; //#if MC>=11600 import java.util.Optional; import java.util.stream.Collectors; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Style; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.Style; //#endif public abstract class AbstractGuiLabel> extends AbstractGuiElement implements IGuiLabel { @@ -58,10 +58,10 @@ public AbstractGuiLabel(GuiContainer container) { @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { super.draw(renderer, size, renderInfo); - TextRenderer fontRenderer = MCVer.getFontRenderer(); + FontRenderer fontRenderer = MCVer.getFontRenderer(); //#if MC>=11600 - List lines = fontRenderer.getTextHandler().wrapLines(new LiteralText(text), size.getWidth(), Style.EMPTY).stream() - .map(it -> it.visit(Optional::of)).filter(Optional::isPresent).map(Optional::get) + List lines = fontRenderer.getCharacterManager().func_238362_b_(new StringTextComponent(text), size.getWidth(), Style.EMPTY).stream() + .map(it -> it.getComponent(Optional::of)).filter(Optional::isPresent).map(Optional::get) .collect(Collectors.toList()); //#else //$$ @SuppressWarnings("unchecked") @@ -70,14 +70,14 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render int y = 0; for (String line : lines) { renderer.drawString(0, y, isEnabled() ? color : disabledColor, line); - y+=fontRenderer.fontHeight; + y+=fontRenderer.FONT_HEIGHT; } } @Override public ReadableDimension calcMinSize() { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - return new Dimension(fontRenderer.getWidth(text), fontRenderer.fontHeight); + FontRenderer fontRenderer = MCVer.getFontRenderer(); + return new Dimension(fontRenderer.getStringWidth(text), fontRenderer.FONT_HEIGHT); } @Override @@ -93,7 +93,7 @@ public T setText(String text) { @Override public T setI18nText(String text, Object... args) { - return setText(I18n.translate(text, args)); + return setText(I18n.format(text, args)); } @Override diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiSlider.java b/src/main/java/com/replaymod/gui/element/AbstractGuiSlider.java index b32e255c..dbed3f23 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiSlider.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiSlider.java @@ -33,7 +33,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; // TODO: Currently assumes a height of 20 public abstract class AbstractGuiSlider> extends AbstractGuiElement implements Clickable, Draggable, IGuiSlider { @@ -156,7 +156,7 @@ public T setText(String text) { @Override public T setI18nText(String text, Object... args) { - return setText(I18n.translate(text, args)); + return setText(I18n.format(text, args)); } @Override diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiTextField.java b/src/main/java/com/replaymod/gui/element/AbstractGuiTextField.java index 09c074d2..bf0e22c4 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiTextField.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiTextField.java @@ -41,12 +41,12 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import com.replaymod.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; //#if MC>=11400 -import net.minecraft.SharedConstants; +import net.minecraft.util.SharedConstants; //#else //$$ import net.minecraft.util.ChatAllowedCharacters; //$$ import org.lwjgl.input.Keyboard; @@ -105,7 +105,7 @@ public T setText(String text) { @Override public T setI18nText(String text, Object... args) { - return setText(I18n.translate(text, args)); + return setText(I18n.format(text, args)); } @Override @@ -161,10 +161,10 @@ public String deleteSelectedText() { private void updateCurrentOffset() { currentOffset = Math.min(currentOffset, cursorPos); String line = text.substring(currentOffset, cursorPos); - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int currentWidth = fontRenderer.getWidth(line); + FontRenderer fontRenderer = MCVer.getFontRenderer(); + int currentWidth = fontRenderer.getStringWidth(line); if (currentWidth > size.getWidth() - 2*BORDER) { - currentOffset = cursorPos - fontRenderer.trimToWidth(line, size.getWidth() - 2*BORDER, true).length(); + currentOffset = cursorPos - fontRenderer.getLineScrollOffset(line, size.getWidth() - 2*BORDER, true).length(); } } @@ -179,7 +179,7 @@ public T writeText(String append) { @Override public T writeChar(char c) { //#if MC>=11400 - if (!SharedConstants.isValidChar(c)) { + if (!SharedConstants.isAllowedCharacter(c)) { //#else //$$ if (!ChatAllowedCharacters.isAllowedCharacter(c)) { //#endif @@ -306,9 +306,9 @@ public boolean mouseClick(ReadablePoint position, int button) { if (hovering && isFocused() && button == 0) { updateCurrentOffset(); int mouseX = position.getX() - BORDER; - TextRenderer fontRenderer = MCVer.getFontRenderer(); + FontRenderer fontRenderer = MCVer.getFontRenderer(); String text = this.text.substring(currentOffset); - int textX = fontRenderer.trimToWidth(text, mouseX).length() + currentOffset; + int textX = fontRenderer.trimStringToWidth(text, mouseX).length() + currentOffset; setCursorPosition(textX); return true; } @@ -354,8 +354,8 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render super.draw(renderer, size, renderInfo); int width = size.getWidth(), height = size.getHeight(); - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int posY = height / 2 - fontRenderer.fontHeight / 2; + FontRenderer fontRenderer = MCVer.getFontRenderer(); + int posY = height / 2 - fontRenderer.FONT_HEIGHT / 2; // Draw black rect once pixel smaller than gray rect renderer.drawRect(0, 0, width, height, isFocused() ? ReadableColor.WHITE : BORDER_COLOR); @@ -363,32 +363,32 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render if (text.isEmpty() && !isFocused() && !Strings.isNullOrEmpty(hint)) { // Draw hint - String text = fontRenderer.trimToWidth(hint, width - 2*BORDER); + String text = fontRenderer.trimStringToWidth(hint, width - 2*BORDER); renderer.drawString(BORDER, posY, textColorDisabled, text); } else { // Draw text String renderText = text.substring(currentOffset); - renderText = fontRenderer.trimToWidth(renderText, width - 2*BORDER); + renderText = fontRenderer.trimStringToWidth(renderText, width - 2*BORDER); ReadableColor color = isEnabled() ? textColorEnabled : textColorDisabled; - int lineEnd = renderer.drawString(BORDER, height / 2 - fontRenderer.fontHeight / 2, color, renderText); + int lineEnd = renderer.drawString(BORDER, height / 2 - fontRenderer.FONT_HEIGHT / 2, color, renderText); // Draw selection int from = getSelectionFrom(); int to = getSelectionTo(); String leftStr = renderText.substring(0, clamp(from - currentOffset, 0, renderText.length())); String rightStr = renderText.substring(clamp(to - currentOffset, 0, renderText.length())); - int left = BORDER + fontRenderer.getWidth(leftStr); - int right = lineEnd - fontRenderer.getWidth(rightStr) - 1; + int left = BORDER + fontRenderer.getStringWidth(leftStr); + int right = lineEnd - fontRenderer.getStringWidth(rightStr) - 1; renderer.invertColors(right, height - 2, left, 2); // Draw cursor if (blinkCursorTick / 6 % 2 == 0 && focused) { String beforeCursor = renderText.substring(0, cursorPos - currentOffset); - int posX = BORDER + fontRenderer.getWidth(beforeCursor); + int posX = BORDER + fontRenderer.getStringWidth(beforeCursor); if (cursorPos == text.length()) { renderer.drawString(posX, posY, CURSOR_COLOR, "_", true); } else { - renderer.drawRect(posX, posY - 1, 1, 1 + fontRenderer.fontHeight, CURSOR_COLOR); + renderer.drawRect(posX, posY - 1, 1, 1 + fontRenderer.FONT_HEIGHT, CURSOR_COLOR); } } } @@ -572,7 +572,7 @@ public T setHint(String hint) { @Override public T setI18nHint(String hint, Object... args) { - return setHint(I18n.translate(hint)); + return setHint(I18n.format(hint)); } @Override diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiTexturedButton.java b/src/main/java/com/replaymod/gui/element/AbstractGuiTexturedButton.java index 6bd8799f..b2b261a8 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiTexturedButton.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiTexturedButton.java @@ -34,11 +34,11 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; -import net.minecraft.util.Identifier; +import net.minecraft.util.ResourceLocation; //#if MC>=10904 -import net.minecraft.sound.SoundEvents; -import net.minecraft.sound.SoundEvent; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.SoundEvent; //#endif //#if MC>=10800 @@ -49,7 +49,7 @@ import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA; public abstract class AbstractGuiTexturedButton> extends AbstractGuiClickable implements Clickable, IGuiTexturedButton { - private Identifier texture; + private ResourceLocation texture; //#if MC>=10904 private SoundEvent sound = SoundEvents.UI_BUTTON_CLICK; @@ -130,12 +130,12 @@ public void onClick() { } @Override - public T setTexture(Identifier resourceLocation, int size) { + public T setTexture(ResourceLocation resourceLocation, int size) { return setTexture(resourceLocation, size, size); } @Override - public T setTexture(Identifier resourceLocation, int width, int height) { + public T setTexture(ResourceLocation resourceLocation, int width, int height) { this.texture = resourceLocation; this.textureTotalSize = new Dimension(width, height); return getThis(); @@ -241,7 +241,7 @@ public SoundEvent getSound() { } //#endif - public Identifier getTexture() { + public ResourceLocation getTexture() { return this.texture; } diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiTooltip.java b/src/main/java/com/replaymod/gui/element/AbstractGuiTooltip.java index e97c9097..8a6b274d 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiTooltip.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiTooltip.java @@ -32,8 +32,8 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.resources.I18n; public abstract class AbstractGuiTooltip> extends AbstractGuiElement { private static final int LINE_SPACING = 3; @@ -63,21 +63,21 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render renderer.drawRect(1, 2, 1, height - 4, BORDER_LIGHT, BORDER_LIGHT, BORDER_DARK, BORDER_DARK); // Left border renderer.drawRect(width - 2, 2, 1, height - 4, BORDER_LIGHT, BORDER_LIGHT, BORDER_DARK, BORDER_DARK); // Right border - TextRenderer fontRenderer = MCVer.getFontRenderer(); + FontRenderer fontRenderer = MCVer.getFontRenderer(); int y = LINE_SPACING + 1; for (String line : text) { renderer.drawString(LINE_SPACING + 1, y, color, line, true); - y += fontRenderer.fontHeight + LINE_SPACING; + y += fontRenderer.FONT_HEIGHT + LINE_SPACING; } } @Override public ReadableDimension calcMinSize() { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int height = 1 + LINE_SPACING + text.length * (fontRenderer.fontHeight + LINE_SPACING); + FontRenderer fontRenderer = MCVer.getFontRenderer(); + int height = 1 + LINE_SPACING + text.length * (fontRenderer.FONT_HEIGHT + LINE_SPACING); int width = 0; for (String line : text) { - int w = fontRenderer.getWidth(line); + int w = fontRenderer.getStringWidth(line); if (w > width) { width = w; } @@ -101,7 +101,7 @@ public T setText(String text) { } public T setI18nText(String text, Object... args) { - return setText(I18n.translate(text, args)); + return setText(I18n.format(text, args)); } public T setColor(ReadableColor color) { diff --git a/src/main/java/com/replaymod/gui/element/GuiElement.java b/src/main/java/com/replaymod/gui/element/GuiElement.java index e12f9983..58e73912 100644 --- a/src/main/java/com/replaymod/gui/element/GuiElement.java +++ b/src/main/java/com/replaymod/gui/element/GuiElement.java @@ -28,11 +28,11 @@ import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; public interface GuiElement> { - MinecraftClient getMinecraft(); + Minecraft getMinecraft(); GuiContainer getContainer(); T setContainer(GuiContainer container); diff --git a/src/main/java/com/replaymod/gui/element/IGuiButton.java b/src/main/java/com/replaymod/gui/element/IGuiButton.java index b9dd9826..d6b5c6b1 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiButton.java +++ b/src/main/java/com/replaymod/gui/element/IGuiButton.java @@ -28,10 +28,10 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.util.Identifier; +import net.minecraft.util.ResourceLocation; //#if MC>=10904 -import net.minecraft.sound.SoundEvent; +import net.minecraft.util.SoundEvent; //#endif public interface IGuiButton> extends IGuiClickable { @@ -45,8 +45,8 @@ public interface IGuiButton> extends IGuiClickable { String getLabel(); - Identifier getTexture(); - T setTexture(Identifier identifier); + ResourceLocation getTexture(); + T setTexture(ResourceLocation identifier); ReadableDimension getTextureSize(); T setTextureSize(ReadableDimension size); @@ -57,10 +57,10 @@ default T setTextureSize(int size) { return setTextureSize(size, size); } - default T setTexture(Identifier identifier, int width, int height) { + default T setTexture(ResourceLocation identifier, int width, int height) { return setTexture(identifier).setTextureSize(width, height); } - default T setTexture(Identifier resourceLocation, int size) { + default T setTexture(ResourceLocation resourceLocation, int size) { return setTexture(resourceLocation, size, size); } diff --git a/src/main/java/com/replaymod/gui/element/IGuiImage.java b/src/main/java/com/replaymod/gui/element/IGuiImage.java index 8afb3054..8d7c2ac9 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiImage.java +++ b/src/main/java/com/replaymod/gui/element/IGuiImage.java @@ -25,12 +25,12 @@ package com.replaymod.gui.element; import com.replaymod.gui.versions.Image; -import net.minecraft.util.Identifier; +import net.minecraft.util.ResourceLocation; public interface IGuiImage> extends GuiElement { T setTexture(Image img); - T setTexture(Identifier resourceLocation); - T setTexture(Identifier resourceLocation, int u, int v, int width, int height); + T setTexture(ResourceLocation resourceLocation); + T setTexture(ResourceLocation resourceLocation, int u, int v, int width, int height); T setU(int u); T setV(int v); diff --git a/src/main/java/com/replaymod/gui/element/IGuiTexturedButton.java b/src/main/java/com/replaymod/gui/element/IGuiTexturedButton.java index 01b17dae..96f830c4 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiTexturedButton.java +++ b/src/main/java/com/replaymod/gui/element/IGuiTexturedButton.java @@ -26,16 +26,16 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.util.Identifier; +import net.minecraft.util.ResourceLocation; //#if MC>=10904 -import net.minecraft.sound.SoundEvent; +import net.minecraft.util.SoundEvent; //#endif public interface IGuiTexturedButton> extends IGuiClickable { - Identifier getTexture(); + ResourceLocation getTexture(); ReadableDimension getTextureTotalSize(); - T setTexture(Identifier resourceLocation, int size); - T setTexture(Identifier resourceLocation, int width, int height); + T setTexture(ResourceLocation resourceLocation, int size); + T setTexture(ResourceLocation resourceLocation, int width, int height); ReadableDimension getTextureSize(); T setTextureSize(int size); diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiDropdownMenu.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiDropdownMenu.java index b0b5c919..32ca22df 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiDropdownMenu.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiDropdownMenu.java @@ -43,7 +43,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.FontRenderer; import java.util.Collection; import java.util.Collections; @@ -83,24 +83,24 @@ public int getMaxLayer() { @Override protected ReadableDimension calcMinSize() { - TextRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); + FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); int maxWidth = 0; for (V value : values) { - int width = fontRenderer.getWidth(toString.apply(value)); + int width = fontRenderer.getStringWidth(toString.apply(value)); if (width > maxWidth) { maxWidth = width; } } - return new Dimension(11 + maxWidth + fontRenderer.fontHeight, fontRenderer.fontHeight + 4); + return new Dimension(11 + maxWidth + fontRenderer.FONT_HEIGHT, fontRenderer.FONT_HEIGHT + 4); } @Override public void layout(ReadableDimension size, RenderInfo renderInfo) { super.layout(size, renderInfo); - TextRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); + FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); if (renderInfo.layer == 1) { ReadablePoint offsetPoint = new Point(0, size.getHeight()); - ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.fontHeight + 5) * values.length); + ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.FONT_HEIGHT + 5) * values.length); dropdown.layout(offsetSize, renderInfo.offsetMouse(0, offsetPoint.getY()).layer(0)); } } @@ -108,7 +108,7 @@ public void layout(ReadableDimension size, RenderInfo renderInfo) { @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { super.draw(renderer, size, renderInfo); - TextRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); + FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); if (renderInfo.layer == 0) { int width = size.getWidth(); int height = size.getHeight(); @@ -127,10 +127,10 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render renderer.drawRect(x - layer, y + (tHeight - layer), layer * 2 - 1, 1, OUTLINE_COLOR); } - renderer.drawString(3, height / 2 - fontRenderer.fontHeight / 2, ReadableColor.WHITE, toString.apply(getSelectedValue())); + renderer.drawString(3, height / 2 - fontRenderer.FONT_HEIGHT / 2, ReadableColor.WHITE, toString.apply(getSelectedValue())); } else if (renderInfo.layer == 1) { ReadablePoint offsetPoint = new Point(0, size.getHeight()); - ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.fontHeight + 5) * values.length); + ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.FONT_HEIGHT + 5) * values.length); OffsetGuiRenderer offsetRenderer = new OffsetGuiRenderer(renderer, offsetPoint, offsetSize); offsetRenderer.startUsing(); try { @@ -268,7 +268,7 @@ protected DropdownEntry getThis() { @Override protected ReadableDimension calcMinSize() { - return new Dimension(0, MCVer.getFontRenderer().fontHeight + 5); + return new Dimension(0, MCVer.getFontRenderer().FONT_HEIGHT + 5); } @Override diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiProgressBar.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiProgressBar.java index 875fa7af..38fb5ab2 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiProgressBar.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiProgressBar.java @@ -32,8 +32,8 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.resources.I18n; public abstract class AbstractGuiProgressBar> extends AbstractGuiElement implements IGuiProgressBar { private static final int BORDER = 2; @@ -63,14 +63,14 @@ public T setLabel(String label) { @Override public T setI18nLabel(String label, Object... args) { - return setLabel(I18n.translate(label, args)); + return setLabel(I18n.format(label, args)); } @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { super.draw(renderer, size, renderInfo); - TextRenderer fontRenderer = MCVer.getFontRenderer(); + FontRenderer fontRenderer = MCVer.getFontRenderer(); int width = size.getWidth(); int height = size.getHeight(); int barTotalWidth = width - 2 * BORDER; @@ -81,7 +81,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render renderer.drawRect(BORDER, BORDER, barDoneWidth, height - 2 * BORDER, ReadableColor.GREY); // Progress String text = String.format(label, (int)(progress * 100)); - renderer.drawCenteredString(width / 2, size.getHeight() / 2 - fontRenderer.fontHeight / 2, ReadableColor.BLACK, text); + renderer.drawCenteredString(width / 2, size.getHeight() / 2 - fontRenderer.FONT_HEIGHT / 2, ReadableColor.BLACK, text); } @Override diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTextArea.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTextArea.java index ddf2c913..b38d84f7 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTextArea.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTextArea.java @@ -39,12 +39,12 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; //#if MC>=11400 -import net.minecraft.SharedConstants; +import net.minecraft.util.SharedConstants; //#else //$$ import net.minecraft.util.ChatAllowedCharacters; //$$ import org.lwjgl.input.Keyboard; @@ -196,14 +196,14 @@ public void deleteSelectedText() { private void updateCurrentOffset() { currentXOffset = Math.min(currentXOffset, cursorX); String line = text[cursorY].substring(currentXOffset, cursorX); - TextRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); - int currentWidth = fontRenderer.getWidth(line); + FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); + int currentWidth = fontRenderer.getStringWidth(line); if (currentWidth > size.getWidth() - BORDER * 2) { - currentXOffset = cursorX - fontRenderer.trimToWidth(line, size.getWidth() - BORDER * 2, true).length(); + currentXOffset = cursorX - fontRenderer.getLineScrollOffset(line, size.getWidth() - BORDER * 2, true).length(); } currentYOffset = Math.min(currentYOffset, cursorY); - int lineHeight = com.replaymod.gui.versions.MCVer.getFontRenderer().fontHeight + LINE_SPACING; + int lineHeight = com.replaymod.gui.versions.MCVer.getFontRenderer().FONT_HEIGHT + LINE_SPACING; int contentHeight = size.getHeight() - BORDER * 2; int maxLines = contentHeight / lineHeight; if (cursorY - currentYOffset >= maxLines) { @@ -228,7 +228,7 @@ public void writeText(String append) { @Override public void writeChar(char c) { //#if MC>=11400 - if (!SharedConstants.isValidChar(c)) { + if (!SharedConstants.isAllowedCharacter(c)) { //#else //$$ if (!ChatAllowedCharacters.isAllowedCharacter(c)) { //#endif @@ -380,13 +380,13 @@ public boolean mouseClick(ReadablePoint position, int button) { updateCurrentOffset(); int mouseX = position.getX() - BORDER; int mouseY = position.getY() - BORDER; - TextRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); - int textY = clamp(mouseY / (fontRenderer.fontHeight + LINE_SPACING) + currentYOffset, 0, text.length - 1); + FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); + int textY = clamp(mouseY / (fontRenderer.FONT_HEIGHT + LINE_SPACING) + currentYOffset, 0, text.length - 1); if (cursorY != textY) { currentXOffset = 0; } String line = text[textY].substring(currentXOffset); - int textX = fontRenderer.trimToWidth(line, mouseX).length() + currentXOffset; + int textX = fontRenderer.trimStringToWidth(line, mouseX).length() + currentXOffset; setCursorPosition(textX, textY); } @@ -429,7 +429,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render updateCurrentOffset(); super.draw(renderer, size, renderInfo); - TextRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); + FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); int width = size.getWidth(); int height = size.getHeight(); @@ -439,7 +439,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render ReadableColor textColor = isEnabled() ? textColorEnabled : textColorDisabled; - int lineHeight = fontRenderer.fontHeight + LINE_SPACING; + int lineHeight = fontRenderer.FONT_HEIGHT + LINE_SPACING; int contentHeight = height - BORDER * 2; int maxLines = contentHeight / lineHeight; int contentWidth = width - BORDER * 2; @@ -447,7 +447,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render // Draw hint if applicable if (hint != null && !isFocused() && Arrays.stream(text).allMatch(String::isEmpty)) { for (int i = 0; i < maxLines && i < hint.length; i++) { - String line = fontRenderer.trimToWidth(hint[i], contentWidth); + String line = fontRenderer.trimStringToWidth(hint[i], contentWidth); int posY = BORDER + i * lineHeight; renderer.drawString(BORDER, posY, textColorDisabled, line, true); @@ -464,7 +464,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render line = line.substring(currentXOffset); leftTrimmed = currentXOffset; } - line = fontRenderer.trimToWidth(line, contentWidth); + line = fontRenderer.trimStringToWidth(line, contentWidth); // Draw line int posY = BORDER + i * lineHeight; @@ -480,26 +480,26 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render } else if (lineY == fromY && lineY == toY) { // Part of line selected String leftStr = line.substring(0, clamp(fromX - leftTrimmed, 0, line.length())); String rightStr = line.substring(clamp(toX - leftTrimmed, 0, line.length())); - int left = BORDER + fontRenderer.getWidth(leftStr); - int right = lineEnd - fontRenderer.getWidth(rightStr) - 1; + int left = BORDER + fontRenderer.getStringWidth(leftStr); + int right = lineEnd - fontRenderer.getStringWidth(rightStr) - 1; renderer.invertColors(right, posY - 1 + lineHeight, left, posY - 1); } else if (lineY == fromY) { // End of line selected String rightStr = line.substring(clamp(fromX - leftTrimmed, 0, line.length())); - renderer.invertColors(lineEnd, posY - 1 + lineHeight, lineEnd - fontRenderer.getWidth(rightStr), posY - 1); + renderer.invertColors(lineEnd, posY - 1 + lineHeight, lineEnd - fontRenderer.getStringWidth(rightStr), posY - 1); } else if (lineY == toY) { // Beginning of line selected String leftStr = line.substring(0, clamp(toX - leftTrimmed, 0, line.length())); - int right = BORDER + fontRenderer.getWidth(leftStr); + int right = BORDER + fontRenderer.getStringWidth(leftStr); renderer.invertColors(right, posY - 1 + lineHeight, BORDER, posY - 1); } // Draw cursor if (lineY == cursorY && blinkCursorTick / 6 % 2 == 0 && focused) { String beforeCursor = line.substring(0, cursorX - leftTrimmed); - int posX = BORDER + fontRenderer.getWidth(beforeCursor); + int posX = BORDER + fontRenderer.getStringWidth(beforeCursor); if (cursorX == text[lineY].length()) { renderer.drawString(posX, posY, CURSOR_COLOR, "_", true); } else { - renderer.drawRect(posX, posY - 1, 1, 1 + fontRenderer.fontHeight, CURSOR_COLOR); + renderer.drawRect(posX, posY - 1, 1, 1 + fontRenderer.FONT_HEIGHT, CURSOR_COLOR); } } } @@ -694,7 +694,7 @@ public T setHint(String... hint) { @Override public T setI18nHint(String hint, Object... args) { - setHint(I18n.translate(hint, args).split("/n")); + setHint(I18n.format(hint, args).split("/n")); return getThis(); } diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimelineTime.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimelineTime.java index 7adff7b8..8e3952c0 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimelineTime.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimelineTime.java @@ -76,7 +76,7 @@ protected void drawTime(GuiRenderer renderer, ReadableDimension size, int time, } else { str = String.format("%02d:%02d", time / 1000 / 60, time / 1000 % 60); } - int stringWidth = MCVer.getFontRenderer().getWidth(str); + int stringWidth = MCVer.getFontRenderer().getStringWidth(str); positionX = Math.max(stringWidth / 2, Math.min(size.getWidth() - stringWidth / 2, positionX)); renderer.drawCenteredString(positionX, 0, Colors.WHITE, str, true); } diff --git a/src/main/java/com/replaymod/gui/popup/GuiFileChooserPopup.java b/src/main/java/com/replaymod/gui/popup/GuiFileChooserPopup.java index 1b8ea508..e62ce780 100644 --- a/src/main/java/com/replaymod/gui/popup/GuiFileChooserPopup.java +++ b/src/main/java/com/replaymod/gui/popup/GuiFileChooserPopup.java @@ -241,7 +241,7 @@ public void run() { @Override protected ReadableDimension calcMinSize() { ReadableDimension dim = super.calcMinSize(); - return new Dimension(dim.getWidth() - 5 - com.replaymod.gui.versions.MCVer.getFontRenderer().fontHeight, + return new Dimension(dim.getWidth() - 5 - com.replaymod.gui.versions.MCVer.getFontRenderer().FONT_HEIGHT, dim.getHeight()); } diff --git a/src/main/java/com/replaymod/gui/utils/EventRegistrations.java b/src/main/java/com/replaymod/gui/utils/EventRegistrations.java index 13187a05..4a0ec788 100644 --- a/src/main/java/com/replaymod/gui/utils/EventRegistrations.java +++ b/src/main/java/com/replaymod/gui/utils/EventRegistrations.java @@ -1,8 +1,8 @@ package com.replaymod.gui.utils; //#if FABRIC<1 -//$$ import com.replaymod.gui.versions.forge.EventsAdapter; -//$$ import net.minecraftforge.common.MinecraftForge; +import com.replaymod.gui.versions.forge.EventsAdapter; +import net.minecraftforge.common.MinecraftForge; //#endif //#if MC<10809 @@ -14,7 +14,7 @@ public class EventRegistrations { //#if FABRIC<1 - //$$ static { new EventsAdapter().register(); } + static { new EventsAdapter().register(); } //#endif private List> registrations = new ArrayList<>(); @@ -30,7 +30,7 @@ public EventRegistrations on(Event event, T listener) { public void register() { //#if FABRIC<1 - //$$ MinecraftForge.EVENT_BUS.register(this); + MinecraftForge.EVENT_BUS.register(this); //#endif //#if MC<10809 //$$ FMLCommonHandler.instance().bus().register(this); @@ -42,7 +42,7 @@ public void register() { public void unregister() { //#if FABRIC<1 - //$$ MinecraftForge.EVENT_BUS.unregister(this); + MinecraftForge.EVENT_BUS.unregister(this); //#endif //#if MC<10809 //$$ FMLCommonHandler.instance().bus().unregister(this); diff --git a/src/main/java/com/replaymod/gui/utils/MouseUtils.java b/src/main/java/com/replaymod/gui/utils/MouseUtils.java index 4d33bdfd..da48f312 100644 --- a/src/main/java/com/replaymod/gui/utils/MouseUtils.java +++ b/src/main/java/com/replaymod/gui/utils/MouseUtils.java @@ -26,23 +26,23 @@ import com.replaymod.gui.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; //#if MC>=11400 -import net.minecraft.client.util.Window; +import net.minecraft.client.MainWindow; //#else //$$ import net.minecraft.client.gui.ScaledResolution; //$$ import org.lwjgl.input.Mouse; //#endif public class MouseUtils { - private static final MinecraftClient mc = com.replaymod.gui.versions.MCVer.getMinecraft(); + private static final Minecraft mc = com.replaymod.gui.versions.MCVer.getMinecraft(); public static Point getMousePos() { //#if MC>=11400 - int mouseX = (int) mc.mouse.getX(); - int mouseY = (int) mc.mouse.getY(); - Window mainWindow = com.replaymod.gui.versions.MCVer.newScaledResolution(mc); + int mouseX = (int) mc.mouseHelper.getMouseX(); + int mouseY = (int) mc.mouseHelper.getMouseY(); + MainWindow mainWindow = com.replaymod.gui.versions.MCVer.newScaledResolution(mc); mouseX = (int) Math.round((double) mouseX * mainWindow.getScaledWidth() / mainWindow.getWidth()); mouseY = (int) Math.round((double) mouseY * mainWindow.getScaledHeight() / mainWindow.getHeight()); //#else @@ -59,7 +59,7 @@ public static Point getMousePos() { public static Point getScaledDimensions() { //#if MC>=11400 - Window + MainWindow //#else //$$ ScaledResolution //#endif diff --git a/src/main/java/com/replaymod/gui/utils/StringUtils.java b/src/main/java/com/replaymod/gui/utils/StringUtils.java index 92d8e886..4e46b929 100644 --- a/src/main/java/com/replaymod/gui/utils/StringUtils.java +++ b/src/main/java/com/replaymod/gui/utils/StringUtils.java @@ -25,7 +25,7 @@ package com.replaymod.gui.utils; import com.replaymod.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.FontRenderer; import java.util.ArrayList; import java.util.List; @@ -33,7 +33,7 @@ public class StringUtils { public static String[] splitStringInMultipleRows(String string, int maxWidth) { if(string == null) return new String[0]; - TextRenderer fontRenderer = MCVer.getFontRenderer(); + FontRenderer fontRenderer = MCVer.getFontRenderer(); List rows = new ArrayList<>(); String remaining = string; while(remaining.length() > 0) { @@ -41,7 +41,7 @@ public static String[] splitStringInMultipleRows(String string, int maxWidth) { String b = ""; for(String sp : split) { b += sp + " "; - if (fontRenderer.getWidth(b.trim()) > maxWidth) { + if (fontRenderer.getStringWidth(b.trim()) > maxWidth) { b = b.substring(0, b.trim().length() - (sp.length())); break; } diff --git a/src/main/java/com/replaymod/gui/versions/Image.java b/src/main/java/com/replaymod/gui/versions/Image.java index 33c3661b..0d7baa99 100644 --- a/src/main/java/com/replaymod/gui/versions/Image.java +++ b/src/main/java/com/replaymod/gui/versions/Image.java @@ -1,7 +1,7 @@ package com.replaymod.gui.versions; -import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.texture.NativeImageBackedTexture; +import net.minecraft.client.renderer.texture.NativeImage; +import net.minecraft.client.renderer.texture.DynamicTexture; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; @@ -25,9 +25,9 @@ public class Image implements AutoCloseable { public Image(int width, int height) { this( //#if FABRIC>=1 - new NativeImage(NativeImage.Format.ABGR, width, height, true) + //$$ new NativeImage(NativeImage.Format.ABGR, width, height, true) //#else - //$$ new NativeImage(NativeImage.PixelFormat.RGBA, width, height, true) + new NativeImage(NativeImage.PixelFormat.RGBA, width, height, true) //#endif ); } @@ -65,7 +65,7 @@ public int getHeight() { public void setRGBA(int x, int y, int r, int g, int b, int a) { // actually takes ABGR, not RGBA - inner.setPixelColor(x, y, ((a & 0xff) << 24) | ((b & 0xff) << 16) | ((g & 0xff) << 8) | (r & 0xff)); + inner.setPixelRGBA(x, y, ((a & 0xff) << 24) | ((b & 0xff) << 16) | ((g & 0xff) << 8) | (r & 0xff)); } public static Image read(Path path) throws IOException { @@ -77,13 +77,13 @@ public static Image read(InputStream in) throws IOException { } public void writePNG(File file) throws IOException { - inner.writeFile(file); + inner.write(file); } public void writePNG(OutputStream outputStream) throws IOException { Path tmp = Files.createTempFile("tmp", ".png"); try { - inner.writeFile(tmp); + inner.write(tmp); Files.copy(tmp, outputStream); } finally { Files.delete(tmp); @@ -108,7 +108,7 @@ public BufferedImage toBufferedImage() { } } - public NativeImageBackedTexture toTexture() { - return new NativeImageBackedTexture(inner); + public DynamicTexture toTexture() { + return new DynamicTexture(inner); } } diff --git a/src/main/java/com/replaymod/gui/versions/MCVer.java b/src/main/java/com/replaymod/gui/versions/MCVer.java index 47b55f56..b0dbdc3d 100644 --- a/src/main/java/com/replaymod/gui/versions/MCVer.java +++ b/src/main/java/com/replaymod/gui/versions/MCVer.java @@ -1,21 +1,21 @@ package com.replaymod.gui.versions; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.Tessellator; -import net.minecraft.util.crash.CrashReportSection; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.crash.CrashReportCategory; import org.lwjgl.opengl.GL11; //#if FABRIC>=1 //#else -//$$ import net.minecraftforge.client.event.GuiScreenEvent; -//$$ import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent; //#endif //#if MC>=11400 -import net.minecraft.client.util.Window; +import net.minecraft.client.MainWindow; import org.lwjgl.glfw.GLFW; //#else //$$ import net.minecraft.client.gui.GuiScreen; @@ -23,7 +23,7 @@ //#endif //#if MC>=10809 -import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; //#endif //#if MC<10800 @@ -37,14 +37,14 @@ * Abstraction over things that have changed between different MC versions. */ public class MCVer { - public static MinecraftClient getMinecraft() { - return MinecraftClient.getInstance(); + public static Minecraft getMinecraft() { + return Minecraft.getInstance(); } //#if MC>=11400 - public static Window newScaledResolution(MinecraftClient mc) { + public static MainWindow newScaledResolution(Minecraft mc) { //#if MC>=11500 - return mc.getWindow(); + return mc.getMainWindow(); //#else //$$ return mc.window; //#endif @@ -59,10 +59,10 @@ public static Window newScaledResolution(MinecraftClient mc) { //$$ } //#endif - public static void addDetail(CrashReportSection category, String name, Callable callable) { + public static void addDetail(CrashReportCategory category, String name, Callable callable) { //#if MC>=10904 //#if MC>=11200 - category.add(name, callable::call); + category.addDetail(name, callable::call); //#else //$$ category.setDetail(name, callable::call); //#endif @@ -87,11 +87,11 @@ public static void drawRect(int right, int bottom, int left, int top) { //#endif //#endif //#if MC>=10809 - vertexBuffer.begin(GL11.GL_QUADS, VertexFormats.POSITION); - vertexBuffer.vertex(right, top, 0).next(); - vertexBuffer.vertex(left, top, 0).next(); - vertexBuffer.vertex(left, bottom, 0).next(); - vertexBuffer.vertex(right, bottom, 0).next(); + vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); + vertexBuffer.pos(right, top, 0).endVertex(); + vertexBuffer.pos(left, top, 0).endVertex(); + vertexBuffer.pos(left, bottom, 0).endVertex(); + vertexBuffer.pos(right, bottom, 0).endVertex(); //#else //$$ vertexBuffer.startDrawingQuads(); //$$ vertexBuffer.addVertex(right, top, 0); @@ -111,11 +111,11 @@ public static void drawRect(int x, int y, int width, int height, ReadableColor t //$$ Tessellator vertexBuffer = tessellator; //#endif //#if MC>=10809 - vertexBuffer.begin(GL11.GL_QUADS, VertexFormats.POSITION_COLOR); - vertexBuffer.vertex(x, y + height, 0).color(bl.getRed(), bl.getGreen(), bl.getBlue(), bl.getAlpha()).next(); - vertexBuffer.vertex(x + width, y + height, 0).color(br.getRed(), br.getGreen(), br.getBlue(), br.getAlpha()).next(); - vertexBuffer.vertex(x + width, y, 0).color(tr.getRed(), tr.getGreen(), tr.getBlue(), tr.getAlpha()).next(); - vertexBuffer.vertex(x, y, 0).color(tl.getRed(), tl.getGreen(), tl.getBlue(), tl.getAlpha()).next(); + vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR); + vertexBuffer.pos(x, y + height, 0).color(bl.getRed(), bl.getGreen(), bl.getBlue(), bl.getAlpha()).endVertex(); + vertexBuffer.pos(x + width, y + height, 0).color(br.getRed(), br.getGreen(), br.getBlue(), br.getAlpha()).endVertex(); + vertexBuffer.pos(x + width, y, 0).color(tr.getRed(), tr.getGreen(), tr.getBlue(), tr.getAlpha()).endVertex(); + vertexBuffer.pos(x, y, 0).color(tl.getRed(), tl.getGreen(), tl.getBlue(), tl.getAlpha()).endVertex(); //#else //$$ vertexBuffer.startDrawingQuads(); //$$ vertexBuffer.setColorRGBA(bl.getRed(), bl.getGreen(), bl.getBlue(), bl.getAlpha()); @@ -130,39 +130,39 @@ public static void drawRect(int x, int y, int width, int height, ReadableColor t tessellator.draw(); } - public static TextRenderer getFontRenderer() { - return getMinecraft().textRenderer; + public static FontRenderer getFontRenderer() { + return getMinecraft().fontRenderer; } //#if FABRIC<=0 - //$$ public static RenderGameOverlayEvent.ElementType getType(RenderGameOverlayEvent event) { + public static RenderGameOverlayEvent.ElementType getType(RenderGameOverlayEvent event) { //#if MC>=10904 - //$$ return event.getType(); + return event.getType(); //#else //$$ return event.type; //#endif - //$$ } - //$$ - //$$ public static int getMouseX(GuiScreenEvent.DrawScreenEvent.Post event) { + } + + public static int getMouseX(GuiScreenEvent.DrawScreenEvent.Post event) { //#if MC>=10904 - //$$ return event.getMouseX(); + return event.getMouseX(); //#else //$$ return event.mouseX; //#endif - //$$ } - //$$ - //$$ public static int getMouseY(GuiScreenEvent.DrawScreenEvent.Post event) { + } + + public static int getMouseY(GuiScreenEvent.DrawScreenEvent.Post event) { //#if MC>=10904 - //$$ return event.getMouseY(); + return event.getMouseY(); //#else //$$ return event.mouseY; //#endif - //$$ } + } //#endif public static void setClipboardString(String text) { //#if MC>=11400 - getMinecraft().keyboard.setClipboard(text); + getMinecraft().keyboardListener.setClipboardString(text); //#else //$$ GuiScreen.setClipboardString(text); //#endif @@ -170,7 +170,7 @@ public static void setClipboardString(String text) { public static String getClipboardString() { //#if MC>=11400 - return getMinecraft().keyboard.getClipboard(); + return getMinecraft().keyboardListener.getClipboardString(); //#else //$$ return GuiScreen.getClipboardString(); //#endif @@ -211,7 +211,7 @@ public static abstract class Keyboard { public static final int KEY_X = GLFW.GLFW_KEY_X; public static void enableRepeatEvents(boolean enabled) { - getMinecraft().keyboard.setRepeatEvents(enabled); + getMinecraft().keyboardListener.enableRepeatEvents(enabled); } } //#endif diff --git a/src/main/java/com/replaymod/gui/versions/callbacks/InitScreenCallback.java b/src/main/java/com/replaymod/gui/versions/callbacks/InitScreenCallback.java index 7273c38e..4a2fec37 100644 --- a/src/main/java/com/replaymod/gui/versions/callbacks/InitScreenCallback.java +++ b/src/main/java/com/replaymod/gui/versions/callbacks/InitScreenCallback.java @@ -2,7 +2,7 @@ import com.replaymod.gui.utils.Event; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.client.gui.widget.Widget; import java.util.List; @@ -15,7 +15,7 @@ public interface InitScreenCallback { } ); - void initScreen(Screen screen, List buttons); + void initScreen(Screen screen, List buttons); interface Pre { Event EVENT = Event.create((listeners) -> diff --git a/src/main/java/com/replaymod/gui/versions/callbacks/PostRenderScreenCallback.java b/src/main/java/com/replaymod/gui/versions/callbacks/PostRenderScreenCallback.java index d6091636..a3efa9ef 100644 --- a/src/main/java/com/replaymod/gui/versions/callbacks/PostRenderScreenCallback.java +++ b/src/main/java/com/replaymod/gui/versions/callbacks/PostRenderScreenCallback.java @@ -1,7 +1,7 @@ package com.replaymod.gui.versions.callbacks; import com.replaymod.gui.utils.Event; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.matrix.MatrixStack; public interface PostRenderScreenCallback { Event EVENT = Event.create((listeners) -> diff --git a/src/main/java/com/replaymod/gui/versions/callbacks/RenderHudCallback.java b/src/main/java/com/replaymod/gui/versions/callbacks/RenderHudCallback.java index 59ef1a81..4634452a 100644 --- a/src/main/java/com/replaymod/gui/versions/callbacks/RenderHudCallback.java +++ b/src/main/java/com/replaymod/gui/versions/callbacks/RenderHudCallback.java @@ -1,7 +1,7 @@ package com.replaymod.gui.versions.callbacks; import com.replaymod.gui.utils.Event; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.matrix.MatrixStack; public interface RenderHudCallback { Event EVENT = Event.create((listeners) -> diff --git a/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java b/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java index 237a2a5e..be08964f 100644 --- a/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java +++ b/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java @@ -1,94 +1,89 @@ package com.replaymod.gui.versions.forge; -//#if FABRIC<1 -//$$ import com.mojang.blaze3d.matrix.MatrixStack; -//$$ import de.johni0702.minecraft.gui.utils.EventRegistrations; -//$$ import de.johni0702.minecraft.gui.versions.callbacks.*; -//$$ import net.minecraft.client.gui.screen.Screen; -//$$ import net.minecraft.client.gui.widget.Widget; -//$$ import net.minecraftforge.client.event.GuiOpenEvent; -//$$ import net.minecraftforge.client.event.GuiScreenEvent; -//$$ import net.minecraftforge.client.event.RenderGameOverlayEvent; -//$$ import net.minecraftforge.event.TickEvent; -//$$ import net.minecraftforge.eventbus.api.EventPriority; -//$$ import net.minecraftforge.eventbus.api.SubscribeEvent; -//$$ -//$$ import java.util.List; -//$$ -//$$ public class EventsAdapter extends EventRegistrations { -//$$ public static Screen getScreen(GuiScreenEvent event) { -//$$ //#if MC>=10904 -//$$ return event.getGui(); -//$$ //#else -//$$ //$$ return event.gui; -//$$ //#endif -//$$ } -//$$ -//$$ public static List getButtonList(GuiScreenEvent.InitGuiEvent event) { -//$$ //#if MC>=10904 -//$$ return event.getWidgetList(); -//$$ //#else -//$$ //$$ return event.buttonList; -//$$ //#endif -//$$ } -//$$ -//$$ @SubscribeEvent -//$$ public void preGuiInit(GuiScreenEvent.InitGuiEvent.Pre event) { -//$$ System.out.println("[Event] preGuiInit"); -//$$ InitScreenCallback.Pre.EVENT.invoker().preInitScreen(getScreen(event)); -//$$ } -//$$ -//$$ @SubscribeEvent -//$$ public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) { -//$$ System.out.println("[Event] onGuiInit"); -//$$ InitScreenCallback.EVENT.invoker().initScreen(getScreen(event), getButtonList(event)); -//$$ } -//$$ -//$$ @SubscribeEvent(priority = EventPriority.LOWEST) -//$$ public void onGuiClosed(GuiOpenEvent event) { -//$$ System.out.println("[Event] onGuiClosed"); -//$$ OpenGuiScreenCallback.EVENT.invoker().openGuiScreen( -//$$ //#if MC>=10904 -//$$ event.getGui() -//$$ //#else -//$$ //$$ event.gui -//$$ //#endif -//$$ ); -//$$ } -//$$ -//$$ public static float getPartialTicks(RenderGameOverlayEvent event) { -//$$ //#if MC>=10904 -//$$ return event.getPartialTicks(); -//$$ //#else -//$$ //$$ return event.partialTicks; -//$$ //#endif -//$$ } -//$$ -//$$ public static float getPartialTicks(GuiScreenEvent.DrawScreenEvent.Post event) { -//$$ //#if MC>=10904 -//$$ return event.getRenderPartialTicks(); -//$$ //#else -//$$ //$$ return event.renderPartialTicks; -//$$ //#endif -//$$ } -//$$ -//$$ @SubscribeEvent -//$$ public void onGuiRender(GuiScreenEvent.DrawScreenEvent.Post event) { -//$$ PostRenderScreenCallback.EVENT.invoker().postRenderScreen(new MatrixStack(), getPartialTicks(event)); -//$$ } -//$$ -//$$ // Even when event was cancelled cause Lunatrius' InGame-Info-XML mod cancels it and we don't actually care about -//$$ // the event (i.e. the overlay text), just about when it's called. -//$$ @SubscribeEvent(receiveCanceled = true) -//$$ public void renderOverlay(RenderGameOverlayEvent.Text event) { -//$$ RenderHudCallback.EVENT.invoker().renderHud(new MatrixStack(), getPartialTicks(event)); -//$$ } -//$$ -//$$ @SubscribeEvent -//$$ public void tickOverlay(TickEvent.ClientTickEvent event) { -//$$ if (event.phase == TickEvent.Phase.START) { -//$$ PreTickCallback.EVENT.invoker().preTick(); -//$$ } -//$$ } -//$$ } -//#endif +import com.mojang.blaze3d.matrix.MatrixStack; +import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.gui.versions.callbacks.*; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.Widget; +import net.minecraftforge.client.event.GuiOpenEvent; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +import java.util.List; + +public class EventsAdapter extends EventRegistrations { + public static Screen getScreen(GuiScreenEvent event) { + //#if MC>=10904 + return event.getGui(); + //#else + //$$ return event.gui; + //#endif + } + + public static List getButtonList(GuiScreenEvent.InitGuiEvent event) { + //#if MC>=10904 + return event.getWidgetList(); + //#else + //$$ return event.buttonList; + //#endif + } + + @SubscribeEvent + public void preGuiInit(GuiScreenEvent.InitGuiEvent.Pre event) { + InitScreenCallback.Pre.EVENT.invoker().preInitScreen(getScreen(event)); + } + + @SubscribeEvent + public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) { + InitScreenCallback.EVENT.invoker().initScreen(getScreen(event), getButtonList(event)); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onGuiClosed(GuiOpenEvent event) { + OpenGuiScreenCallback.EVENT.invoker().openGuiScreen( + //#if MC>=10904 + event.getGui() + //#else + //$$ event.gui + //#endif + ); + } + + public static float getPartialTicks(RenderGameOverlayEvent event) { + //#if MC>=10904 + return event.getPartialTicks(); + //#else + //$$ return event.partialTicks; + //#endif + } + + public static float getPartialTicks(GuiScreenEvent.DrawScreenEvent.Post event) { + //#if MC>=10904 + return event.getRenderPartialTicks(); + //#else + //$$ return event.renderPartialTicks; + //#endif + } + + @SubscribeEvent + public void onGuiRender(GuiScreenEvent.DrawScreenEvent.Post event) { + PostRenderScreenCallback.EVENT.invoker().postRenderScreen(new MatrixStack(), getPartialTicks(event)); + } + + // Even when event was cancelled cause Lunatrius' InGame-Info-XML mod cancels it and we don't actually care about + // the event (i.e. the overlay text), just about when it's called. + @SubscribeEvent(receiveCanceled = true) + public void renderOverlay(RenderGameOverlayEvent.Text event) { + RenderHudCallback.EVENT.invoker().renderHud(new MatrixStack(), getPartialTicks(event)); + } + + @SubscribeEvent + public void tickOverlay(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + PreTickCallback.EVENT.invoker().preTick(); + } + } +} diff --git a/src/main/java/com/replaymod/mixin/AbstractButtonWidgetAccessor.java b/src/main/java/com/replaymod/mixin/AbstractButtonWidgetAccessor.java index d466f0d1..7d534b31 100644 --- a/src/main/java/com/replaymod/mixin/AbstractButtonWidgetAccessor.java +++ b/src/main/java/com/replaymod/mixin/AbstractButtonWidgetAccessor.java @@ -1,11 +1,11 @@ //#if MC>=11400 package com.replaymod.mixin; -import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.client.gui.widget.Widget; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(AbstractButtonWidget.class) +@Mixin(Widget.class) public interface AbstractButtonWidgetAccessor { @Accessor int getHeight(); diff --git a/src/main/java/com/replaymod/mixin/AddServerScreenAccessor.java b/src/main/java/com/replaymod/mixin/AddServerScreenAccessor.java index 5fa3a5a7..305fa977 100644 --- a/src/main/java/com/replaymod/mixin/AddServerScreenAccessor.java +++ b/src/main/java/com/replaymod/mixin/AddServerScreenAccessor.java @@ -1,12 +1,12 @@ package com.replaymod.mixin; import net.minecraft.client.gui.screen.AddServerScreen; -import net.minecraft.client.network.ServerInfo; +import net.minecraft.client.multiplayer.ServerData; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(AddServerScreen.class) public interface AddServerScreenAccessor { - @Accessor - ServerInfo getServer(); + @Accessor("serverData") + ServerData getServer(); } diff --git a/src/main/java/com/replaymod/mixin/EntityLivingBaseAccessor.java b/src/main/java/com/replaymod/mixin/EntityLivingBaseAccessor.java index a75daf17..06e61d5d 100644 --- a/src/main/java/com/replaymod/mixin/EntityLivingBaseAccessor.java +++ b/src/main/java/com/replaymod/mixin/EntityLivingBaseAccessor.java @@ -7,7 +7,7 @@ import javax.annotation.Nonnull; //#if MC>=10904 -import net.minecraft.entity.data.TrackedData; +import net.minecraft.network.datasync.DataParameter; //#endif @Mixin(LivingEntity.class) @@ -16,6 +16,6 @@ public interface EntityLivingBaseAccessor { @Accessor("LIVING_FLAGS") @Nonnull @SuppressWarnings("ConstantConditions") - static TrackedData getLivingFlags() { return null; } + static DataParameter getLivingFlags() { return null; } //#endif } diff --git a/src/main/java/com/replaymod/mixin/EntityPlayerAccessor.java b/src/main/java/com/replaymod/mixin/EntityPlayerAccessor.java index 7f2ef6db..d65fd8ab 100644 --- a/src/main/java/com/replaymod/mixin/EntityPlayerAccessor.java +++ b/src/main/java/com/replaymod/mixin/EntityPlayerAccessor.java @@ -8,9 +8,9 @@ @Mixin(PlayerEntity.class) public interface EntityPlayerAccessor extends Mixin_EntityLivingBaseAccessor { //#if MC>=10904 - @Accessor("selectedItem") + @Accessor ItemStack getItemStackMainHand(); - @Accessor("selectedItem") + @Accessor void setItemStackMainHand(ItemStack value); //#else //$$ @Accessor diff --git a/src/main/java/com/replaymod/mixin/FirstPersonRendererAccessor.java b/src/main/java/com/replaymod/mixin/FirstPersonRendererAccessor.java index fdc5b318..b9e7e00c 100644 --- a/src/main/java/com/replaymod/mixin/FirstPersonRendererAccessor.java +++ b/src/main/java/com/replaymod/mixin/FirstPersonRendererAccessor.java @@ -1,24 +1,24 @@ package com.replaymod.mixin; -import net.minecraft.client.render.item.HeldItemRenderer; +import net.minecraft.client.renderer.FirstPersonRenderer; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(HeldItemRenderer.class) +@Mixin(FirstPersonRenderer.class) public interface FirstPersonRendererAccessor { //#if MC>=10904 - @Accessor("mainHand") + @Accessor void setItemStackMainHand(ItemStack value); - @Accessor("offHand") + @Accessor void setItemStackOffHand(ItemStack value); - @Accessor("equipProgressMainHand") + @Accessor void setEquippedProgressMainHand(float value); - @Accessor("prevEquipProgressMainHand") + @Accessor void setPrevEquippedProgressMainHand(float value); - @Accessor("equipProgressOffHand") + @Accessor void setEquippedProgressOffHand(float value); - @Accessor("prevEquipProgressOffHand") + @Accessor void setPrevEquippedProgressOffHand(float value); //#else //$$ @Accessor diff --git a/src/main/java/com/replaymod/mixin/GuiMainMenuAccessor.java b/src/main/java/com/replaymod/mixin/GuiMainMenuAccessor.java index e1e3dc8d..68e11cae 100644 --- a/src/main/java/com/replaymod/mixin/GuiMainMenuAccessor.java +++ b/src/main/java/com/replaymod/mixin/GuiMainMenuAccessor.java @@ -1,16 +1,16 @@ package com.replaymod.mixin; -import net.minecraft.client.gui.screen.TitleScreen; +import net.minecraft.client.gui.screen.MainMenuScreen; import net.minecraft.client.gui.screen.Screen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(TitleScreen.class) +@Mixin(MainMenuScreen.class) public interface GuiMainMenuAccessor { //#if MC>=10904 - @Accessor("realmsNotificationGui") + @Accessor Screen getRealmsNotification(); - @Accessor("realmsNotificationGui") + @Accessor void setRealmsNotification(Screen value); //#endif } diff --git a/src/main/java/com/replaymod/mixin/GuiScreenAccessor.java b/src/main/java/com/replaymod/mixin/GuiScreenAccessor.java index 01f59bcb..32caebaa 100644 --- a/src/main/java/com/replaymod/mixin/GuiScreenAccessor.java +++ b/src/main/java/com/replaymod/mixin/GuiScreenAccessor.java @@ -7,20 +7,20 @@ import java.util.List; //#if MC>=11400 -import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.client.gui.widget.Widget; //#else //$$ import net.minecraft.client.gui.GuiButton; //#endif //#if MC>=11400 -import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.IGuiEventListener; //#endif @Mixin(Screen.class) public interface GuiScreenAccessor { //#if MC>=11400 @Accessor - List getButtons(); + List getButtons(); //#else //$$ @Accessor("buttonList") //$$ List getButtons(); @@ -28,6 +28,6 @@ public interface GuiScreenAccessor { //#if MC>=11400 @Accessor - List getChildren(); + List getChildren(); //#endif } diff --git a/src/main/java/com/replaymod/mixin/IntegratedServerAccessor.java b/src/main/java/com/replaymod/mixin/IntegratedServerAccessor.java index ac5cecea..02eda9a7 100644 --- a/src/main/java/com/replaymod/mixin/IntegratedServerAccessor.java +++ b/src/main/java/com/replaymod/mixin/IntegratedServerAccessor.java @@ -8,7 +8,7 @@ public interface IntegratedServerAccessor { // TODO probably https://github.com/ReplayMod/remap/issues/10 //#if MC>=11500 - @Accessor("paused") + @Accessor("isGamePaused") //#else //$$ @Accessor("field_5524") //#endif diff --git a/src/main/java/com/replaymod/mixin/ItemRendererAccessor.java b/src/main/java/com/replaymod/mixin/ItemRendererAccessor.java index fc0a7072..f747064d 100644 --- a/src/main/java/com/replaymod/mixin/ItemRendererAccessor.java +++ b/src/main/java/com/replaymod/mixin/ItemRendererAccessor.java @@ -1,14 +1,14 @@ //#if MC>=10904 package com.replaymod.mixin; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.color.item.ItemColors; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.color.ItemColors; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(ItemRenderer.class) public interface ItemRendererAccessor { - @Accessor("colorMap") + @Accessor ItemColors getItemColors(); } //#endif diff --git a/src/main/java/com/replaymod/mixin/KeyBindingAccessor.java b/src/main/java/com/replaymod/mixin/KeyBindingAccessor.java index 5ddcb888..8553259c 100644 --- a/src/main/java/com/replaymod/mixin/KeyBindingAccessor.java +++ b/src/main/java/com/replaymod/mixin/KeyBindingAccessor.java @@ -1,13 +1,13 @@ package com.replaymod.mixin; -import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.settings.KeyBinding; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(KeyBinding.class) public interface KeyBindingAccessor { - @Accessor("timesPressed") + @Accessor int getPressTime(); - @Accessor("timesPressed") + @Accessor void setPressTime(int value); } diff --git a/src/main/java/com/replaymod/mixin/MainWindowAccessor.java b/src/main/java/com/replaymod/mixin/MainWindowAccessor.java index 5cfc6371..a044d217 100644 --- a/src/main/java/com/replaymod/mixin/MainWindowAccessor.java +++ b/src/main/java/com/replaymod/mixin/MainWindowAccessor.java @@ -1,10 +1,10 @@ package com.replaymod.mixin; -import net.minecraft.client.util.Window; +import net.minecraft.client.MainWindow; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(Window.class) +@Mixin(MainWindow.class) public interface MainWindowAccessor { @Accessor int getFramebufferWidth(); diff --git a/src/main/java/com/replaymod/mixin/MinecraftAccessor.java b/src/main/java/com/replaymod/mixin/MinecraftAccessor.java index aeacb7f4..28bd1f53 100644 --- a/src/main/java/com/replaymod/mixin/MinecraftAccessor.java +++ b/src/main/java/com/replaymod/mixin/MinecraftAccessor.java @@ -1,8 +1,8 @@ package com.replaymod.mixin; -import net.minecraft.client.MinecraftClient; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.Minecraft; +import net.minecraft.crash.CrashReport; +import net.minecraft.util.Timer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @@ -21,22 +21,22 @@ //$$ import java.util.List; //#endif -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) public interface MinecraftAccessor { - @Accessor("renderTickCounter") - RenderTickCounter getTimer(); - @Accessor("renderTickCounter") - void setTimer(RenderTickCounter value); + @Accessor + Timer getTimer(); + @Accessor + void setTimer(Timer value); //#if MC>=11400 - @Accessor + @Accessor("futureRefreshResources") CompletableFuture getResourceReloadFuture(); - @Accessor + @Accessor("futureRefreshResources") void setResourceReloadFuture(CompletableFuture value); //#endif //#if MC>=11400 - @Accessor + @Accessor("queueChunkTracking") Queue getRenderTaskQueue(); //#else //$$ @Accessor @@ -44,11 +44,11 @@ public interface MinecraftAccessor { //#endif //#if FABRIC>=1 - @Accessor("crashReport") - CrashReport getCrashReporter(); - //#else - //$$ @Accessor + //$$ @Accessor("crashReport") //$$ CrashReport getCrashReporter(); + //#else + @Accessor + CrashReport getCrashReporter(); //#endif //#if MC<11400 diff --git a/src/main/java/com/replaymod/mixin/MixinCamera.java b/src/main/java/com/replaymod/mixin/MixinCamera.java index 13286d4e..fb90e140 100644 --- a/src/main/java/com/replaymod/mixin/MixinCamera.java +++ b/src/main/java/com/replaymod/mixin/MixinCamera.java @@ -1,10 +1,10 @@ package com.replaymod.mixin; import com.replaymod.replay.camera.CameraEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.util.math.vector.Vector3f; import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -15,18 +15,18 @@ @Mixin(GameRenderer.class) public class MixinCamera { - @Shadow @Final private MinecraftClient client; + @Shadow @Final private Minecraft mc; @Inject( method = "renderWorld", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/render/Camera;getPitch()F" + target = "Lnet/minecraft/client/renderer/ActiveRenderInfo;getPitch()F" ) ) private void applyRoll(float float_1, long long_1, MatrixStack matrixStack, CallbackInfo ci) { - Entity entity = this.client.getCameraEntity() == null ? this.client.player : this.client.getCameraEntity(); + Entity entity = this.mc.getRenderViewEntity() == null ? this.mc.player : this.mc.getRenderViewEntity(); if (entity instanceof CameraEntity) { - matrixStack.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(((CameraEntity) entity).roll)); + matrixStack.rotate(Vector3f.ZP.rotationDegrees(((CameraEntity) entity).roll)); } } } diff --git a/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java b/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java new file mode 100644 index 00000000..1bf9487d --- /dev/null +++ b/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java @@ -0,0 +1,45 @@ +package com.replaymod.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.play.ClientPlayNetHandler; +import net.minecraft.client.util.SearchTreeManager; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.STagsListPacket; +import net.minecraft.tags.ITagCollectionSupplier; +import org.spongepowered.asm.mixin.Final; +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(ClientPlayNetHandler.class) +public abstract class MixinClientPlayNetHandler { + @Shadow @Final + private NetworkManager netManager; + + @Shadow + private Minecraft client; + + @Shadow + private ITagCollectionSupplier networkTagManager; + + @Inject(method = "handleTags", at=@At(value = "HEAD"), cancellable = true) + public void replayMod_ignoreHandshakeConnectionClose(STagsListPacket packetIn, CallbackInfo ci) { + System.out.println("Injected ClientPlayNetHandler.handleTags"); + // PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); + ITagCollectionSupplier itagcollectionsupplier = packetIn.getTags(); + // boolean vanillaConnection = net.minecraftforge.fml.network.NetworkHooks.isVanillaConnection(netManager); + boolean vanillaConnection = false; + net.minecraftforge.common.ForgeTagHandler.resetCachedTagCollections(true, vanillaConnection); + itagcollectionsupplier = ITagCollectionSupplier.reinjectOptionalTags(itagcollectionsupplier); + this.networkTagManager = itagcollectionsupplier; + if (!this.netManager.isLocalChannel()) { + itagcollectionsupplier.updateTags(); + } + + this.client.getSearchTree(SearchTreeManager.TAGS).recalculate(); + + ci.cancel(); + } +} diff --git a/src/main/java/com/replaymod/mixin/MixinDownloadingPackFinder.java b/src/main/java/com/replaymod/mixin/MixinDownloadingPackFinder.java index e3547df8..5edb94be 100644 --- a/src/main/java/com/replaymod/mixin/MixinDownloadingPackFinder.java +++ b/src/main/java/com/replaymod/mixin/MixinDownloadingPackFinder.java @@ -3,14 +3,14 @@ import com.replaymod.recording.packet.ResourcePackRecorder; import com.replaymod.gui.utils.Consumer; -import net.minecraft.client.resource.ClientBuiltinResourcePackProvider; +import net.minecraft.client.resources.DownloadingPackFinder; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import java.io.File; //#if MC>=11600 -import net.minecraft.resource.ResourcePackSource; +import net.minecraft.resources.IPackNameDecorator; //#endif //#if MC>=10800 @@ -23,7 +23,7 @@ //$$ import java.util.Map; //#endif -@Mixin(ClientBuiltinResourcePackProvider.class) +@Mixin(DownloadingPackFinder.class) public abstract class MixinDownloadingPackFinder implements ResourcePackRecorder.IDownloadingPackFinder { private Consumer requestCallback; @@ -33,11 +33,11 @@ public void setRequestCallback(Consumer callback) { } //#if MC>=10800 - @Inject(method = "loadServerPack", at = @At("HEAD")) + @Inject(method = "setServerPack", at = @At("HEAD")) private void recordDownloadedPack( File file, //#if MC>=11600 - ResourcePackSource arg, + IPackNameDecorator arg, //#endif CallbackInfoReturnable ci ) { diff --git a/src/main/java/com/replaymod/mixin/MixinEntityRenderer.java b/src/main/java/com/replaymod/mixin/MixinEntityRenderer.java index d42f449f..9093cdd3 100644 --- a/src/main/java/com/replaymod/mixin/MixinEntityRenderer.java +++ b/src/main/java/com/replaymod/mixin/MixinEntityRenderer.java @@ -1,7 +1,7 @@ package com.replaymod.mixin; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.renderer.GameRenderer; import org.spongepowered.asm.mixin.Mixin; @Mixin(GameRenderer.class) diff --git a/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java b/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java new file mode 100644 index 00000000..29815314 --- /dev/null +++ b/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java @@ -0,0 +1,41 @@ +package com.replaymod.mixin; + +import io.netty.channel.ChannelPipeline; +import net.minecraft.network.NetworkManager; +import net.minecraft.util.text.ITextComponent; +import net.minecraftforge.fml.network.FMLHandshakeHandler; +import net.minecraftforge.fml.network.NetworkDirection; +import net.minecraftforge.fml.network.NetworkRegistry; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.MixinEnvironment; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +@Mixin(FMLHandshakeHandler.class) +public abstract class MixinFMLHandshakeHandler { + @Shadow + private List messageList; + + @Shadow @Final + private NetworkDirection direction; + + @Inject(method = "(Lnet/minecraft/network/NetworkManager;Lnet/minecraftforge/fml/network/NetworkDirection;)V", at = @At("TAIL")) + public void replayModRecording_setupForLocalRecording(NetworkManager networkManager, NetworkDirection side, CallbackInfo ci) { + if (!networkManager.isLocalChannel()) { + return; + } + + System.out.println("Force FML handshaking and set LoginPayloads"); + this.messageList = NetworkRegistryAccessor.invokeGatherLoginPayloads(this.direction, false); + } + + @Redirect(method = "handleRegistryLoading", at=@At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;closeChannel(Lnet/minecraft/util/text/ITextComponent;)V")) + public void replayMod_ignoreHandshakeConnectionClose(NetworkManager networkManager, ITextComponent message) {} +} diff --git a/src/main/java/com/replaymod/mixin/MixinGameRenderer.java b/src/main/java/com/replaymod/mixin/MixinGameRenderer.java index 176671e9..7a789bda 100644 --- a/src/main/java/com/replaymod/mixin/MixinGameRenderer.java +++ b/src/main/java/com/replaymod/mixin/MixinGameRenderer.java @@ -3,9 +3,9 @@ import com.replaymod.core.events.PostRenderWorldCallback; import com.replaymod.core.events.PreRenderHandCallback; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.GameRenderer; +import com.mojang.blaze3d.matrix.MatrixStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -17,7 +17,7 @@ public class MixinGameRenderer { method = "renderWorld", at = @At( value = "FIELD", - target = "Lnet/minecraft/client/render/GameRenderer;renderHand:Z" + target = "Lnet/minecraft/client/renderer/GameRenderer;renderHand:Z" ) ) private void postRenderWorld( @@ -38,7 +38,7 @@ private void preRenderHand( //#if MC>=11500 MatrixStack matrixStack, //#endif - Camera camera, + ActiveRenderInfo camera, float partialTicks, CallbackInfo ci) { if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) { diff --git a/src/main/java/com/replaymod/mixin/MixinGuiSpectator.java b/src/main/java/com/replaymod/mixin/MixinGuiSpectator.java index ef09a804..5cd447ea 100644 --- a/src/main/java/com/replaymod/mixin/MixinGuiSpectator.java +++ b/src/main/java/com/replaymod/mixin/MixinGuiSpectator.java @@ -2,7 +2,7 @@ package com.replaymod.mixin; import com.replaymod.replay.camera.CameraEntity; -import net.minecraft.client.gui.hud.SpectatorHud; +import net.minecraft.client.gui.SpectatorGui; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -10,10 +10,10 @@ import static com.replaymod.core.versions.MCVer.*; -@Mixin(SpectatorHud.class) +@Mixin(SpectatorGui.class) public abstract class MixinGuiSpectator { //#if MC>=10904 - @Inject(method = "cycleSlot", at = @At("HEAD"), cancellable = true) + @Inject(method = "onMouseScroll", at = @At("HEAD"), cancellable = true) //#else //$$ @Inject(method = "func_175260_a", at = @At("HEAD"), cancellable = true) //#endif diff --git a/src/main/java/com/replaymod/mixin/MixinInGameHud.java b/src/main/java/com/replaymod/mixin/MixinInGameHud.java index ea2afa19..189cecfa 100644 --- a/src/main/java/com/replaymod/mixin/MixinInGameHud.java +++ b/src/main/java/com/replaymod/mixin/MixinInGameHud.java @@ -3,16 +3,16 @@ import com.replaymod.replay.events.RenderHotbarCallback; import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; -import net.minecraft.client.gui.hud.InGameHud; +import net.minecraft.client.gui.IngameGui; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(InGameHud.class) +@Mixin(IngameGui.class) public class MixinInGameHud { - @Inject(method = "shouldRenderSpectatorCrosshair", at = @At("HEAD"), cancellable = true) + @Inject(method = "isTargetNamedMenuProvider", at = @At("HEAD"), cancellable = true) private void shouldRenderSpectatorCrosshair(CallbackInfoReturnable ci) { Boolean state = RenderSpectatorCrosshairCallback.EVENT.invoker().shouldRenderSpectatorCrosshair(); if (state != null) { diff --git a/src/main/java/com/replaymod/mixin/MixinKeyboardListener.java b/src/main/java/com/replaymod/mixin/MixinKeyboardListener.java index ed2e18c6..f47ec8b2 100644 --- a/src/main/java/com/replaymod/mixin/MixinKeyboardListener.java +++ b/src/main/java/com/replaymod/mixin/MixinKeyboardListener.java @@ -2,24 +2,24 @@ import com.replaymod.core.events.KeyBindingEventCallback; import com.replaymod.core.events.KeyEventCallback; -import net.minecraft.client.Keyboard; +import net.minecraft.client.KeyboardListener; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(Keyboard.class) +@Mixin(KeyboardListener.class) public class MixinKeyboardListener { - private static final String ON_KEY_PRESSED = "Lnet/minecraft/client/options/KeyBinding;onKeyPressed(Lnet/minecraft/client/util/InputUtil$Key;)V"; + private static final String ON_KEY_PRESSED = "Lnet/minecraft/client/settings/KeyBinding;onTick(Lnet/minecraft/client/util/InputMappings$Input;)V"; - @Inject(method = "onKey", at = @At(value = "INVOKE", target = ON_KEY_PRESSED), cancellable = true) + @Inject(method = "onKeyEvent", at = @At(value = "INVOKE", target = ON_KEY_PRESSED), cancellable = true) private void beforeKeyBindingTick(long windowPointer, int key, int scanCode, int action, int modifiers, CallbackInfo ci) { if (KeyEventCallback.EVENT.invoker().onKeyEvent(key, scanCode, action, modifiers)) { ci.cancel(); } } - @Inject(method = "onKey", at = @At(value = "INVOKE", target = ON_KEY_PRESSED, shift = At.Shift.AFTER)) + @Inject(method = "onKeyEvent", at = @At(value = "INVOKE", target = ON_KEY_PRESSED, shift = At.Shift.AFTER)) private void afterKeyBindingTick(long windowPointer, int key, int scanCode, int action, int modifiers, CallbackInfo ci) { KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); } diff --git a/src/main/java/com/replaymod/mixin/MixinMinecraft.java b/src/main/java/com/replaymod/mixin/MixinMinecraft.java index 32e69db1..6d802519 100644 --- a/src/main/java/com/replaymod/mixin/MixinMinecraft.java +++ b/src/main/java/com/replaymod/mixin/MixinMinecraft.java @@ -1,7 +1,7 @@ package com.replaymod.mixin; import com.replaymod.core.MinecraftMethodAccessor; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -18,13 +18,13 @@ //#endif //#if MC>=11400 -import net.minecraft.util.thread.ReentrantThreadExecutor; +import net.minecraft.util.concurrent.RecursiveEventLoop; //#endif -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) public abstract class MixinMinecraft //#if MC>=11400 - extends ReentrantThreadExecutor + extends RecursiveEventLoop //#endif implements MinecraftMethodAccessor { @@ -34,32 +34,32 @@ public abstract class MixinMinecraft //#endif //#if FABRIC>=1 - @Shadow protected abstract void handleInputEvents(); + //$$ @Shadow protected abstract void handleInputEvents(); //#elseif MC>=11400 - //$$ @Shadow protected abstract void processKeyBinds(); + @Shadow protected abstract void processKeyBinds(); //#endif public void replayModProcessKeyBinds() { - handleInputEvents(); + processKeyBinds(); } //#if MC>=11400 public void replayModExecuteTaskQueue() { - runTasks(); + drainTasks(); } //#endif //#if MC>=11400 - @Inject(method = "render", + @Inject(method = "runGameLoop", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/render/GameRenderer;render(FJZ)V")) + target = "Lnet/minecraft/client/renderer/GameRenderer;updateCameraAndRender(FJZ)V")) private void preRender(boolean unused, CallbackInfo ci) { PreRenderCallback.EVENT.invoker().preRender(); } - @Inject(method = "render", + @Inject(method = "runGameLoop", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/render/GameRenderer;render(FJZ)V", + target = "Lnet/minecraft/client/renderer/GameRenderer;updateCameraAndRender(FJZ)V", shift = At.Shift.AFTER)) private void postRender(boolean unused, CallbackInfo ci) { PostRenderCallback.EVENT.invoker().postRender(); diff --git a/src/main/java/com/replaymod/mixin/MixinMouse.java b/src/main/java/com/replaymod/mixin/MixinMouse.java index 45cccfc4..e3f3ef45 100644 --- a/src/main/java/com/replaymod/mixin/MixinMouse.java +++ b/src/main/java/com/replaymod/mixin/MixinMouse.java @@ -3,16 +3,16 @@ import com.replaymod.core.events.KeyBindingEventCallback; import com.replaymod.core.events.KeyEventCallback; -import net.minecraft.client.Keyboard; -import net.minecraft.client.Mouse; +import net.minecraft.client.KeyboardListener; +import net.minecraft.client.MouseHelper; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(Mouse.class) +@Mixin(MouseHelper.class) public class MixinMouse { - @Inject(method = "onMouseButton", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/options/KeyBinding;onKeyPressed(Lnet/minecraft/client/util/InputUtil$Key;)V", shift = At.Shift.AFTER)) + @Inject(method = "mouseButtonCallback", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/settings/KeyBinding;onTick(Lnet/minecraft/client/util/InputMappings$Input;)V", shift = At.Shift.AFTER)) private void afterKeyBindingTick(CallbackInfo ci) { KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); } diff --git a/src/main/java/com/replaymod/mixin/MixinMouseHelper.java b/src/main/java/com/replaymod/mixin/MixinMouseHelper.java index bcf1319b..d258ca18 100644 --- a/src/main/java/com/replaymod/mixin/MixinMouseHelper.java +++ b/src/main/java/com/replaymod/mixin/MixinMouseHelper.java @@ -3,7 +3,7 @@ import com.replaymod.replay.InputReplayTimer; import com.replaymod.replay.ReplayModReplay; -import net.minecraft.client.Mouse; +import net.minecraft.client.MouseHelper; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -11,22 +11,22 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -@Mixin(Mouse.class) +@Mixin(MouseHelper.class) public abstract class MixinMouseHelper { @Shadow - private boolean cursorLocked; + private boolean mouseGrabbed; - @Inject(method = "lockCursor", at = @At("HEAD"), cancellable = true) + @Inject(method = "grabMouse", at = @At("HEAD"), cancellable = true) private void noGrab(CallbackInfo ci) { // Used to be provided by Forge for 1.12.2 and below if (Boolean.valueOf(System.getProperty("fml.noGrab", "false"))) { - this.cursorLocked = true; + this.mouseGrabbed = true; ci.cancel(); } } - @Inject(method = "onMouseScroll", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isSpectator()Z"), + @Inject(method = "scrollCallback", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/entity/player/ClientPlayerEntity;isSpectator()Z"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) private void handleReplayModScroll( diff --git a/src/main/java/com/replaymod/mixin/MixinMouseListener.java b/src/main/java/com/replaymod/mixin/MixinMouseListener.java index 683845a0..8cd9abcc 100644 --- a/src/main/java/com/replaymod/mixin/MixinMouseListener.java +++ b/src/main/java/com/replaymod/mixin/MixinMouseListener.java @@ -1,55 +1,55 @@ //#if FABRIC>=1 -package com.replaymod.mixin; - -import com.replaymod.gui.versions.callbacks.MouseCallback; -import net.minecraft.client.Mouse; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.screen.Screen; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Mouse.class) -public abstract class MixinMouseListener { - @Accessor // Note: for some reason Mixin doesn't include this in the refmap json if it's just a @Shadow field - abstract int getActiveButton(); - - @Inject(method = "method_1611", at = @At("HEAD"), cancellable = true) - private void mouseDown(boolean[] result, double x, double y, int button, CallbackInfo ci) { - if (com.replaymod.gui.versions.callbacks.MouseCallback.EVENT.invoker().mouseDown(x, y, button)) { - result[0] = true; - ci.cancel(); - } - } - - @Inject(method = "method_1605", at = @At("HEAD"), cancellable = true) - private void mouseUp(boolean[] result, double x, double y, int button, CallbackInfo ci) { - if (com.replaymod.gui.versions.callbacks.MouseCallback.EVENT.invoker().mouseUp(x, y, button)) { - result[0] = true; - ci.cancel(); - } - } - - @Inject(method = "method_1602", at = @At("HEAD"), cancellable = true) - private void mouseDrag(Element element, double x, double y, double dx, double dy, CallbackInfo ci) { - if (com.replaymod.gui.versions.callbacks.MouseCallback.EVENT.invoker().mouseDrag(x, y, getActiveButton(), dx, dy)) { - ci.cancel(); - } - } - - @Redirect( - method = "onMouseScroll", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseScrolled(DDD)Z") - ) - private boolean mouseScroll(Screen element, double x, double y, double scroll) { - if (MouseCallback.EVENT.invoker().mouseScroll(x, y, scroll)) { - return true; - } else { - return element.mouseScrolled(x, y, scroll); - } - } -} +//$$ package com.replaymod.mixin; +//$$ +//$$ import com.replaymod.gui.versions.callbacks.MouseCallback; +//$$ import net.minecraft.client.Mouse; +//$$ import net.minecraft.client.gui.Element; +//$$ import net.minecraft.client.gui.screen.Screen; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.gen.Accessor; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.Redirect; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ +//$$ @Mixin(Mouse.class) +//$$ public abstract class MixinMouseListener { +//$$ @Accessor // Note: for some reason Mixin doesn't include this in the refmap json if it's just a @Shadow field +//$$ abstract int getActiveButton(); +//$$ +//$$ @Inject(method = "method_1611", at = @At("HEAD"), cancellable = true) +//$$ private void mouseDown(boolean[] result, double x, double y, int button, CallbackInfo ci) { +//$$ if (com.replaymod.gui.versions.callbacks.MouseCallback.EVENT.invoker().mouseDown(x, y, button)) { +//$$ result[0] = true; +//$$ ci.cancel(); +//$$ } +//$$ } +//$$ +//$$ @Inject(method = "method_1605", at = @At("HEAD"), cancellable = true) +//$$ private void mouseUp(boolean[] result, double x, double y, int button, CallbackInfo ci) { +//$$ if (com.replaymod.gui.versions.callbacks.MouseCallback.EVENT.invoker().mouseUp(x, y, button)) { +//$$ result[0] = true; +//$$ ci.cancel(); +//$$ } +//$$ } +//$$ +//$$ @Inject(method = "method_1602", at = @At("HEAD"), cancellable = true) +//$$ private void mouseDrag(Element element, double x, double y, double dx, double dy, CallbackInfo ci) { +//$$ if (com.replaymod.gui.versions.callbacks.MouseCallback.EVENT.invoker().mouseDrag(x, y, getActiveButton(), dx, dy)) { +//$$ ci.cancel(); +//$$ } +//$$ } +//$$ +//$$ @Redirect( +//$$ method = "onMouseScroll", +//$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseScrolled(DDD)Z") +//$$ ) +//$$ private boolean mouseScroll(Screen element, double x, double y, double scroll) { +//$$ if (MouseCallback.EVENT.invoker().mouseScroll(x, y, scroll)) { +//$$ return true; +//$$ } else { +//$$ return element.mouseScrolled(x, y, scroll); +//$$ } +//$$ } +//$$ } //#endif diff --git a/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java b/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java index 84c6f067..4e1a5274 100644 --- a/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java +++ b/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java @@ -2,12 +2,10 @@ import com.replaymod.core.versions.MCVer; import com.replaymod.recording.ReplayModRecording; -import com.replaymod.recording.handler.RecordingEventHandler.RecordingEventSender; -import net.minecraft.client.network.ClientLoginNetworkHandler; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.Packet; -import net.minecraft.network.packet.s2c.login.LoginQueryRequestS2CPacket; -import net.minecraft.network.packet.s2c.login.LoginSuccessS2CPacket; +import com.replaymod.recording.handler.RecordingEventHandler; +import net.minecraft.client.network.login.ClientLoginNetHandler; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.login.server.SCustomPayloadLoginPacket; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -15,29 +13,34 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(ClientLoginNetworkHandler.class) +@Mixin(ClientLoginNetHandler.class) public abstract class MixinNetHandlerLoginClient { @Final @Shadow - private ClientConnection connection; + private NetworkManager networkManager; - @Inject(method = "onQueryRequest", at=@At("HEAD")) - private void earlyInitiateRecording(LoginQueryRequestS2CPacket packet, CallbackInfo ci) { - initiateRecording(packet); + @Inject(method = "handleLoginSuccess", at=@At("HEAD")) + public void replayModRecording_initiateRecording(CallbackInfo cb) { + initiateRecording(null); } - @Inject(method = "onLoginSuccess", at=@At("HEAD")) - private void lateInitiateRecording(LoginSuccessS2CPacket packet, CallbackInfo ci) { - initiateRecording(packet); + /** + * Starts the recording right before switching into PLAY state. + * We cannot use the {@link FMLNetworkEvent.ClientConnectedToServerEvent} + * as it only fires after the forge handshake. + */ + @Inject(method = "handleCustomPayloadLogin", at=@At("HEAD")) + public void replayModRecording_initiateRecording(SCustomPayloadLoginPacket packetIn, CallbackInfo cb) { + initiateRecording(packetIn); } - private void initiateRecording(Packet packet) { - RecordingEventSender eventSender = (RecordingEventSender) MCVer.getMinecraft().worldRenderer; + private void initiateRecording(SCustomPayloadLoginPacket packet) { + RecordingEventHandler.RecordingEventSender eventSender = (RecordingEventHandler.RecordingEventSender) MCVer.getMinecraft().worldRenderer; if (eventSender.getRecordingEventHandler() != null) { return; // already recording } - ReplayModRecording.instance.initiateRecording(this.connection); - if (eventSender.getRecordingEventHandler() != null) { + ReplayModRecording.instance.initiateRecording(this.networkManager); + if (eventSender.getRecordingEventHandler() != null && packet != null) { eventSender.getRecordingEventHandler().onPacket(packet); } } diff --git a/src/main/java/com/replaymod/mixin/MixinNetHandlerPlayClient.java b/src/main/java/com/replaymod/mixin/MixinNetHandlerPlayClient.java index 8fbead2a..207c09b1 100644 --- a/src/main/java/com/replaymod/mixin/MixinNetHandlerPlayClient.java +++ b/src/main/java/com/replaymod/mixin/MixinNetHandlerPlayClient.java @@ -2,9 +2,9 @@ import com.replaymod.core.versions.MCVer; import com.replaymod.recording.handler.RecordingEventHandler; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket; +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.play.ClientPlayNetHandler; +import net.minecraft.network.play.server.SRespawnPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -17,9 +17,9 @@ import com.replaymod.replaystudio.protocol.packets.PacketPlayerListEntry; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket; -import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.server.SPlayerListItemPacket; +import net.minecraft.client.network.play.NetworkPlayerInfo; import java.io.IOException; import java.util.Map; @@ -28,15 +28,15 @@ //$$ import net.minecraft.network.play.server.S01PacketJoinGame; //#endif -@Mixin(ClientPlayNetworkHandler.class) +@Mixin(ClientPlayNetHandler.class) public abstract class MixinNetHandlerPlayClient { // The stupid name is required as otherwise Mixin treats it as a shadow, seemingly ignoring the lack of @Shadow - private static MinecraftClient mcStatic = MCVer.getMinecraft(); + private static Minecraft mcStatic = MCVer.getMinecraft(); //#if MC>=10800 @Shadow - private Map playerListEntries; + private Map playerInfoMap; //#endif public RecordingEventHandler getRecordingEventHandler() { @@ -52,22 +52,22 @@ public RecordingEventHandler getRecordingEventHandler() { */ //#if MC>=10800 //#if FABRIC>=1 - @Inject(method = "onPlayerList", at=@At("HEAD")) + //$$ @Inject(method = "onPlayerList", at=@At("HEAD")) //#else - //$$ @Inject(method = "handlePlayerListItem", at=@At("HEAD")) + @Inject(method = "handlePlayerListItem", at=@At("HEAD")) //#endif - public void recordOwnJoin(PlayerListS2CPacket packet, CallbackInfo ci) { - if (!mcStatic.isOnThread()) return; + public void recordOwnJoin(SPlayerListItemPacket packet, CallbackInfo ci) { + if (!mcStatic.isOnExecutionThread()) return; if (mcStatic.player == null) return; RecordingEventHandler handler = getRecordingEventHandler(); - if (handler != null && packet.getAction() == PlayerListS2CPacket.Action.ADD_PLAYER) { + if (handler != null && packet.getAction() == SPlayerListItemPacket.Action.ADD_PLAYER) { // We cannot reference SPacketPlayerListItem.AddPlayerData directly for complicated (and yet to be // resolved) reasons (see https://github.com/MinecraftForge/ForgeGradle/issues/472), so we use ReplayStudio // to parse it instead. ByteBuf byteBuf = Unpooled.buffer(); try { - packet.write(new PacketByteBuf(byteBuf)); + packet.writePacketData(new PacketBuffer(byteBuf)); byteBuf.readerIndex(0); byte[] array = new byte[byteBuf.readableBytes()]; @@ -80,7 +80,7 @@ public void recordOwnJoin(PlayerListS2CPacket packet, CallbackInfo ci) { if (data.getUuid() == null) continue; // Only add spawn packet for our own player and only if he isn't known yet if (data.getUuid().equals(mcStatic.player.getGameProfile().getId()) - && !this.playerListEntries.containsKey(data.getUuid())) { + && !this.playerInfoMap.containsKey(data.getUuid())) { handler.spawnRecordingPlayer(); } } @@ -109,11 +109,11 @@ public void recordOwnJoin(PlayerListS2CPacket packet, CallbackInfo ci) { * @param ci Callback info */ //#if FABRIC>=1 - @Inject(method = "onPlayerRespawn", at=@At("RETURN")) + //$$ @Inject(method = "onPlayerRespawn", at=@At("RETURN")) //#else - //$$ @Inject(method = "handleRespawn", at=@At("RETURN")) + @Inject(method = "handleRespawn", at=@At("RETURN")) //#endif - public void recordOwnRespawn(PlayerRespawnS2CPacket packet, CallbackInfo ci) { + public void recordOwnRespawn(SRespawnPacket packet, CallbackInfo ci) { RecordingEventHandler handler = getRecordingEventHandler(); if (handler != null) { handler.spawnRecordingPlayer(); diff --git a/src/main/java/com/replaymod/mixin/MixinParticleManager.java b/src/main/java/com/replaymod/mixin/MixinParticleManager.java index 73b032b6..a546ff41 100644 --- a/src/main/java/com/replaymod/mixin/MixinParticleManager.java +++ b/src/main/java/com/replaymod/mixin/MixinParticleManager.java @@ -7,21 +7,21 @@ import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleManager; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.vector.Vector3d; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; //#if MC>=11500 -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.util.math.Quaternion; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import net.minecraft.util.math.vector.Quaternion; //#else //$$ import com.replaymod.render.blend.mixin.ParticleAccessor; //$$ import net.minecraft.client.render.BufferBuilder; //#endif //#if MC>=11400 -import net.minecraft.client.render.Camera; +import net.minecraft.client.renderer.ActiveRenderInfo; //#else //$$ import net.minecraft.entity.Entity; //#endif @@ -29,8 +29,8 @@ @Mixin(ParticleManager.class) public abstract class MixinParticleManager { //#if MC>=11500 - @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;buildGeometry(Lnet/minecraft/client/render/VertexConsumer;Lnet/minecraft/client/render/Camera;F)V")) - private void buildOrientedGeometry(Particle particle, VertexConsumer vertexConsumer, Camera camera, float partialTicks) { + @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lcom/mojang/blaze3d/vertex/IVertexBuilder;Lnet/minecraft/client/renderer/ActiveRenderInfo;F)V")) + private void buildOrientedGeometry(Particle particle, IVertexBuilder vertexConsumer, ActiveRenderInfo camera, float partialTicks) { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); if (handler == null || !handler.omnidirectional) { buildGeometry(particle, vertexConsumer, camera, partialTicks); @@ -38,9 +38,9 @@ private void buildOrientedGeometry(Particle particle, VertexConsumer vertexConsu Quaternion rotation = camera.getRotation(); Quaternion org = rotation.copy(); try { - Vec3d from = new Vec3d(0, 0, 1); - Vec3d to = MCVer.getPosition(particle, partialTicks).subtract(camera.getPos()).normalize(); - Vec3d axis = from.crossProduct(to); + Vector3d from = new Vector3d(0, 0, 1); + Vector3d to = MCVer.getPosition(particle, partialTicks).subtract(camera.getProjectedView()).normalize(); + Vector3d axis = from.crossProduct(to); rotation.set((float) axis.x, (float) axis.y, (float) axis.z, (float) (1 + from.dotProduct(to))); rotation.normalize(); @@ -51,12 +51,12 @@ private void buildOrientedGeometry(Particle particle, VertexConsumer vertexConsu } } - private void buildGeometry(Particle particle, VertexConsumer vertexConsumer, Camera camera, float partialTicks) { + private void buildGeometry(Particle particle, IVertexBuilder vertexConsumer, ActiveRenderInfo camera, float partialTicks) { BlendState blendState = BlendState.getState(); if (blendState != null) { blendState.get(ParticlesExporter.class).onRender(particle, partialTicks); } - particle.buildGeometry(vertexConsumer, camera, partialTicks); + particle.renderParticle(vertexConsumer, camera, partialTicks); } //#else //#if MC>=11200 diff --git a/src/main/java/com/replaymod/mixin/MixinRender.java b/src/main/java/com/replaymod/mixin/MixinRender.java index 55a5a025..04096518 100644 --- a/src/main/java/com/replaymod/mixin/MixinRender.java +++ b/src/main/java/com/replaymod/mixin/MixinRender.java @@ -2,7 +2,7 @@ import com.replaymod.extras.ReplayModExtras; import com.replaymod.extras.playeroverview.PlayerOverview; -import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import org.spongepowered.asm.mixin.Mixin; @@ -39,7 +39,7 @@ public void replayModExtras_isPlayerHidden(Entity entity, @Coerce Object camera, ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { if (entity instanceof PlayerEntity) { PlayerEntity player = (PlayerEntity) entity; - if (playerOverview.isHidden(player.getUuid())) { + if (playerOverview.isHidden(player.getUniqueID())) { ci.setReturnValue(false); } } diff --git a/src/main/java/com/replaymod/mixin/MixinRenderArrow.java b/src/main/java/com/replaymod/mixin/MixinRenderArrow.java index 7769d511..fb63c619 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderArrow.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderArrow.java @@ -2,21 +2,21 @@ package com.replaymod.mixin; import com.replaymod.replay.ReplayModReplay; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.ArrowEntityRenderer; -import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.TippedArrowRenderer; +import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Mixin; //#if MC>=11500 -import net.minecraft.client.render.Frustum; +import net.minecraft.client.renderer.culling.ClippingHelper; //#else //$$ import net.minecraft.client.render.VisibleRegion; //#endif -@Mixin(ArrowEntityRenderer.class) +@Mixin(TippedArrowRenderer.class) public abstract class MixinRenderArrow extends EntityRenderer { - protected MixinRenderArrow(EntityRenderDispatcher renderManager) { + protected MixinRenderArrow(EntityRendererManager renderManager) { super(renderManager); } @@ -24,7 +24,7 @@ protected MixinRenderArrow(EntityRenderDispatcher renderManager) { @Override public boolean shouldRender(Entity entity, //#if MC>=11500 - Frustum camera, + ClippingHelper camera, //#else //$$ VisibleRegion camera, //#endif diff --git a/src/main/java/com/replaymod/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/mixin/MixinRenderGlobal.java index 63c4a854..f7a4846d 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderGlobal.java @@ -1,7 +1,7 @@ package com.replaymod.mixin; import com.replaymod.recording.handler.RecordingEventHandler; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.renderer.WorldRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -27,7 +27,7 @@ public RecordingEventHandler getRecordingEventHandler() { } //#if MC>=10800 - @Inject(method = "setBlockBreakingInfo", at = @At("HEAD")) + @Inject(method = "sendBlockBreakProgress", at = @At("HEAD")) //#else //$$ @Inject(method = "destroyBlockPartially", at = @At("HEAD")) //#endif diff --git a/src/main/java/com/replaymod/mixin/MixinRenderItem.java b/src/main/java/com/replaymod/mixin/MixinRenderItem.java index 0e53e5ef..81881776 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderItem.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderItem.java @@ -10,13 +10,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC>=11500 -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; //#endif //#if MC>=11400 -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.model.IBakedModel; //#else //#if MC>=10904 //$$ import net.minecraft.client.renderer.RenderItem; @@ -34,8 +34,8 @@ //#endif public abstract class MixinRenderItem { //#if MC>=11500 - @Inject(method = "renderBakedItemModel", at = @At("HEAD")) - private void onRenderModel(BakedModel model, ItemStack stack, int int_1, int int_2, MatrixStack matrixStack_1, VertexConsumer vertexConsumer_1, CallbackInfo ci) { + @Inject(method = "renderModel", at = @At("HEAD")) + private void onRenderModel(IBakedModel model, ItemStack stack, int int_1, int int_2, MatrixStack matrixStack_1, IVertexBuilder vertexConsumer_1, CallbackInfo ci) { //#else //#if MC>=11400 //$$ @Inject(method = "renderItemModel", at = @At("HEAD")) diff --git a/src/main/java/com/replaymod/mixin/MixinRenderLivingBase.java b/src/main/java/com/replaymod/mixin/MixinRenderLivingBase.java index c0af8647..f2369810 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderLivingBase.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderLivingBase.java @@ -9,13 +9,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC>=10904 -import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.LivingRenderer; //#else //$$ import net.minecraft.client.renderer.entity.RendererLivingEntity; //#endif //#if MC>=10904 -@Mixin(LivingEntityRenderer.class) +@Mixin(LivingRenderer.class) //#else //$$ @Mixin(RendererLivingEntity.class) //#endif @@ -31,7 +31,7 @@ public abstract class MixinRenderLivingBase { //#endif value = "INVOKE", //#if MC>=11500 - target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;scale(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/client/util/math/MatrixStack;F)V", + target = "Lnet/minecraft/client/renderer/entity/LivingRenderer;preRenderCallback(Lnet/minecraft/entity/LivingEntity;Lcom/mojang/blaze3d/matrix/MatrixStack;F)V", //#else //#if MC>=10904 //$$ target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;scaleAndTranslate(Lnet/minecraft/entity/LivingEntity;F)F", diff --git a/src/main/java/com/replaymod/mixin/MixinRenderManager.java b/src/main/java/com/replaymod/mixin/MixinRenderManager.java index 65c2d2ef..d870a373 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderManager.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderManager.java @@ -2,7 +2,7 @@ import com.replaymod.core.versions.MCVer; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -10,10 +10,10 @@ import org.spongepowered.asm.mixin.injection.Inject; //#if MC>=11500 -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; -import net.minecraft.util.math.Quaternion; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraft.util.math.vector.Quaternion; //#endif //#if MC>=10904 @@ -22,17 +22,17 @@ //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; //#endif -@Mixin(EntityRenderDispatcher.class) +@Mixin(EntityRendererManager.class) public abstract class MixinRenderManager { //#if MC>=11500 - @Shadow private Quaternion rotation; + @Shadow private Quaternion cameraOrientation; //#else //$$ @Shadow private float cameraPitch; //$$ @Shadow private float cameraYaw; //#endif //#if MC>=11500 - @Inject(method = "render", at = @At("HEAD")) + @Inject(method = "renderEntityStatic", at = @At("HEAD")) //#else //#if MC>=11400 && FABRIC>=1 //$$ @Inject(method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", at = @At("HEAD")) @@ -48,7 +48,7 @@ public abstract class MixinRenderManager { private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, //#if MC>=11500 MatrixStack matrixStack, - VertexConsumerProvider vertexConsumerProvider, + IRenderTypeBuffer vertexConsumerProvider, int int_1, //#else //$$ boolean iDoNotCare, @@ -62,9 +62,9 @@ private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); double yaw = -Math.atan2(dx, dz); //#if MC>=11500 - this.rotation = new Quaternion(0.0F, 0.0F, 0.0F, 1.0F); - this.rotation.hamiltonProduct(Vector3f.POSITIVE_Y.getDegreesQuaternion((float) -yaw)); - this.rotation.hamiltonProduct(Vector3f.POSITIVE_X.getDegreesQuaternion((float) pitch)); + this.cameraOrientation = new Quaternion(0.0F, 0.0F, 0.0F, 1.0F); + this.cameraOrientation.multiply(Vector3f.YP.rotationDegrees((float) -yaw)); + this.cameraOrientation.multiply(Vector3f.XP.rotationDegrees((float) pitch)); //#else //$$ this.cameraPitch = (float) Math.toDegrees(pitch); //$$ this.cameraYaw = (float) Math.toDegrees(yaw); diff --git a/src/main/java/com/replaymod/mixin/MixinScreen.java b/src/main/java/com/replaymod/mixin/MixinScreen.java index 4130b190..ad0e305f 100644 --- a/src/main/java/com/replaymod/mixin/MixinScreen.java +++ b/src/main/java/com/replaymod/mixin/MixinScreen.java @@ -1,9 +1,9 @@ package com.replaymod.mixin; import com.replaymod.gui.versions.callbacks.InitScreenCallback; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.client.gui.widget.Widget; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -16,15 +16,15 @@ @Mixin(Screen.class) public class MixinScreen { @Shadow - protected @Final List buttons; + protected @Final List buttons; - @Inject(method = "init(Lnet/minecraft/client/MinecraftClient;II)V", at = @At("HEAD")) - private void preInit(MinecraftClient minecraftClient_1, int int_1, int int_2, CallbackInfo ci) { + @Inject(method = "init(Lnet/minecraft/client/Minecraft;II)V", at = @At("HEAD")) + private void preInit(Minecraft minecraftClient_1, int int_1, int int_2, CallbackInfo ci) { InitScreenCallback.Pre.EVENT.invoker().preInitScreen((Screen) (Object) this); } - @Inject(method = "init(Lnet/minecraft/client/MinecraftClient;II)V", at = @At("RETURN")) - private void init(MinecraftClient minecraftClient_1, int int_1, int int_2, CallbackInfo ci) { + @Inject(method = "init(Lnet/minecraft/client/Minecraft;II)V", at = @At("RETURN")) + private void init(Minecraft minecraftClient_1, int int_1, int int_2, CallbackInfo ci) { InitScreenCallback.EVENT.invoker().initScreen((Screen) (Object) this, buttons); } } diff --git a/src/main/java/com/replaymod/mixin/MixinServerInfo.java b/src/main/java/com/replaymod/mixin/MixinServerInfo.java index d8cf0d7a..8844697d 100644 --- a/src/main/java/com/replaymod/mixin/MixinServerInfo.java +++ b/src/main/java/com/replaymod/mixin/MixinServerInfo.java @@ -1,15 +1,15 @@ package com.replaymod.mixin; import com.replaymod.recording.ServerInfoExt; -import net.minecraft.client.network.ServerInfo; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.nbt.CompoundNBT; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(ServerInfo.class) +@Mixin(ServerData.class) public abstract class MixinServerInfo implements ServerInfoExt { private Boolean autoRecording; @@ -23,16 +23,16 @@ public void setAutoRecording(Boolean autoRecording) { this.autoRecording = autoRecording; } - @Inject(method = "serialize", at = @At("RETURN")) - private void serialize(CallbackInfoReturnable ci) { - CompoundTag tag = ci.getReturnValue(); + @Inject(method = "getNBTCompound", at = @At("RETURN")) + private void serialize(CallbackInfoReturnable ci) { + CompoundNBT tag = ci.getReturnValue(); if (autoRecording != null) { tag.putBoolean("autoRecording", autoRecording); } } - @Inject(method = "deserialize", at = @At("RETURN")) - private static void deserialize(CompoundTag tag, CallbackInfoReturnable ci) { + @Inject(method = "getServerDataFromNBTCompound", at = @At("RETURN")) + private static void deserialize(CompoundNBT tag, CallbackInfoReturnable ci) { ServerInfoExt serverInfo = ServerInfoExt.from(ci.getReturnValue()); if (tag.contains("autoRecording")) { serverInfo.setAutoRecording(tag.getBoolean("autoRecording")); @@ -40,7 +40,7 @@ private static void deserialize(CompoundTag tag, CallbackInfoReturnable=11500 -@Mixin(net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk.class) +@Mixin(net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.ChunkRender.class) //#else //$$ @Mixin(net.minecraft.client.render.chunk.ChunkRenderer.class) //#endif public abstract class MixinShaderRenderChunk { - private final MinecraftClient mc = MinecraftClient.getInstance(); + private final Minecraft mc = Minecraft.getInstance(); //#if MC>=11500 - @Shadow private int rebuildFrame; + @Shadow private int frameIndex; - @Shadow public abstract boolean shouldBuild(); + @Shadow public abstract boolean shouldStayLoaded(); /** @@ -38,12 +38,12 @@ public abstract class MixinShaderRenderChunk { * This is the most convenient place to re-introduce the check (setRebuildFrame would normally be called right after * shouldBuild, if it returns true). */ - @Inject(method = "setRebuildFrame", at = @At("HEAD"), cancellable = true) + @Inject(method = "setFrameIndex", at = @At("HEAD"), cancellable = true) private void replayModCompat_OFHaveYouConsideredWhetherThisChunkShouldEvenBeBuilt(int rebuildFrame, CallbackInfoReturnable ci) { - if (this.rebuildFrame == rebuildFrame) { + if (this.frameIndex == rebuildFrame) { // want to keep the fast path ci.setReturnValue(false); - } else if (!this.shouldBuild()) { + } else if (!this.shouldStayLoaded()) { // this is the check which OF removed // So, I think I figured out the reason why optifine applies this change: It's so chunks which are outside // the server view distance are still rendered if they've previously compiled. The bug still stands but diff --git a/src/main/java/com/replaymod/mixin/MixinShadersRender.java b/src/main/java/com/replaymod/mixin/MixinShadersRender.java index 0abacb41..7d6ff54d 100644 --- a/src/main/java/com/replaymod/mixin/MixinShadersRender.java +++ b/src/main/java/com/replaymod/mixin/MixinShadersRender.java @@ -1,6 +1,6 @@ package com.replaymod.mixin; -import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.renderer.GameRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.injection.At; @@ -8,8 +8,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC>=11600 -import net.minecraft.client.render.Camera; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.renderer.ActiveRenderInfo; +import com.mojang.blaze3d.matrix.MatrixStack; //#endif //#if MC>=11400 @@ -31,7 +31,7 @@ private static void replayModCompat_disableRenderHand0( GameRenderer er, //#if MC>=11600 MatrixStack stack, - Camera camera, + ActiveRenderInfo camera, //#endif float partialTicks, //#if MC<11600 diff --git a/src/main/java/com/replaymod/mixin/MixinTileEntityEndPortalRenderer.java b/src/main/java/com/replaymod/mixin/MixinTileEntityEndPortalRenderer.java index a15249f5..553cdd5c 100644 --- a/src/main/java/com/replaymod/mixin/MixinTileEntityEndPortalRenderer.java +++ b/src/main/java/com/replaymod/mixin/MixinTileEntityEndPortalRenderer.java @@ -13,13 +13,13 @@ //#endif //#if MC>=11500 -@Mixin(net.minecraft.client.render.RenderPhase.PortalTexturing.class) +@Mixin(net.minecraft.client.renderer.RenderState.PortalTexturingState.class) //#else //$$ @Mixin(net.minecraft.client.render.block.entity.EndPortalBlockEntityRenderer.class) //#endif public class MixinTileEntityEndPortalRenderer { //#if MC>=11500 - @Redirect(method = "method_23557", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;getMeasuringTimeMs()J")) + @Redirect(method = "func_228597_a_", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;milliTime()J")) static //#else //#if MC>=11400 @@ -46,7 +46,7 @@ private long replayModReplay_getEnchantmentTime() { return replayHandler.getReplaySender().currentTimeStamp(); } //#if MC>=11400 - return Util.getMeasuringTimeMs(); + return Util.milliTime(); //#else //$$ return Minecraft.getSystemTime(); //#endif diff --git a/src/main/java/com/replaymod/mixin/MixinViewFrustum.java b/src/main/java/com/replaymod/mixin/MixinViewFrustum.java index 3d8d6254..a3a4733a 100644 --- a/src/main/java/com/replaymod/mixin/MixinViewFrustum.java +++ b/src/main/java/com/replaymod/mixin/MixinViewFrustum.java @@ -1,27 +1,27 @@ //#if MC>=10800 package com.replaymod.mixin; -import net.minecraft.client.render.BuiltChunkStorage; +import net.minecraft.client.renderer.ViewFrustum; 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.Redirect; //#if MC>=11500 -import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.ChunkRender; //#else //$$ import net.minecraft.client.render.chunk.ChunkRenderer; //#endif -@Mixin(BuiltChunkStorage.class) +@Mixin(ViewFrustum.class) public abstract class MixinViewFrustum { @Redirect( - method = "updateCameraPosition", + method = "updateChunkPositions", at = @At( value = "INVOKE", //#if MC>=10904 //#if MC>=11500 - target = "Lnet/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk;setOrigin(III)V" + target = "Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$ChunkRender;setPosition(III)V" //#else //$$ target = "Lnet/minecraft/client/render/chunk/ChunkRenderer;setOrigin(III)V" //#endif @@ -32,7 +32,7 @@ public abstract class MixinViewFrustum { ) private void replayModReplay_updatePositionAndMarkForUpdate( //#if MC>=11500 - BuiltChunk renderChunk, + ChunkRender renderChunk, //#else //$$ ChunkRenderer renderChunk, //#endif @@ -45,10 +45,10 @@ private void replayModReplay_updatePositionAndMarkForUpdate( //#if MC>=10904 BlockPos pos = new BlockPos(x, y, z); //#endif - if (!pos.equals(renderChunk.getOrigin())) { + if (!pos.equals(renderChunk.getPosition())) { //#if MC>=10904 - renderChunk.setOrigin(x, y, z); - renderChunk.scheduleRebuild(false); + renderChunk.setPosition(x, y, z); + renderChunk.setNeedsUpdate(false); //#else //$$ renderChunk.setPosition(pos); //$$ renderChunk.setNeedsUpdate(true); diff --git a/src/main/java/com/replaymod/mixin/MixinWorldClient.java b/src/main/java/com/replaymod/mixin/MixinWorldClient.java index 4f39a67f..d94310e3 100644 --- a/src/main/java/com/replaymod/mixin/MixinWorldClient.java +++ b/src/main/java/com/replaymod/mixin/MixinWorldClient.java @@ -2,12 +2,12 @@ //#if MC>=10904 import com.replaymod.recording.handler.RecordingEventHandler; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.profiler.Profiler; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; +import net.minecraft.profiler.IProfiler; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; @@ -17,19 +17,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC>=11600 -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.MutableWorldProperties; +import net.minecraft.util.RegistryKey; +import net.minecraft.world.storage.ISpawnWorldInfo; import java.util.function.Supplier; //#else //$$ import net.minecraft.world.level.LevelProperties; //#endif //#if MC>=11400 -import net.minecraft.world.chunk.ChunkManager; +import net.minecraft.world.chunk.AbstractChunkProvider; //#if MC<11600 //$$ import net.minecraft.world.dimension.Dimension; //#endif -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.DimensionType; import java.util.function.BiFunction; //#else //$$ import net.minecraft.world.storage.ISaveHandler; @@ -45,14 +45,14 @@ @Mixin(ClientWorld.class) public abstract class MixinWorldClient extends World implements RecordingEventHandler.RecordingEventSender { @Shadow - private MinecraftClient client; + private Minecraft mc; //#if MC>=11600 - protected MixinWorldClient(MutableWorldProperties mutableWorldProperties, RegistryKey registryKey, + protected MixinWorldClient(ISpawnWorldInfo mutableWorldProperties, RegistryKey registryKey, //#if MC<11602 //$$ RegistryKey registryKey2, //#endif - DimensionType dimensionType, Supplier profiler, boolean bl, boolean bl2, long l) { + DimensionType dimensionType, Supplier profiler, boolean bl, boolean bl2, long l) { super(mutableWorldProperties, registryKey, //#if MC<11602 //$$ registryKey2, @@ -86,7 +86,7 @@ protected MixinWorldClient(MutableWorldProperties mutableWorldProperties, Regist //#endif private RecordingEventHandler replayModRecording_getRecordingEventHandler() { - return ((RecordingEventHandler.RecordingEventSender) this.client.worldRenderer).getRecordingEventHandler(); + return ((RecordingEventHandler.RecordingEventSender) this.mc.worldRenderer).getRecordingEventHandler(); } // Sounds that are emitted by thePlayer no longer take the long way over the server @@ -95,11 +95,11 @@ private RecordingEventHandler replayModRecording_getRecordingEventHandler() { // E.g. Block place sounds //#if MC>=11400 //#if FABRIC>=1 - @Inject(method = "playSound(Lnet/minecraft/entity/player/PlayerEntity;DDDLnet/minecraft/sound/SoundEvent;Lnet/minecraft/sound/SoundCategory;FF)V", - at = @At("HEAD")) - //#else - //$$ @Inject(method = "playSound(Lnet/minecraft/entity/player/PlayerEntity;DDDLnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V", + //$$ @Inject(method = "playSound(Lnet/minecraft/entity/player/PlayerEntity;DDDLnet/minecraft/sound/SoundEvent;Lnet/minecraft/sound/SoundCategory;FF)V", //$$ at = @At("HEAD")) + //#else + @Inject(method = "playSound(Lnet/minecraft/entity/player/PlayerEntity;DDDLnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V", + at = @At("HEAD")) //#endif //#else //$$ @Inject(method = "playSound(Lnet/minecraft/entity/player/EntityPlayer;DDDLnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V", @@ -107,7 +107,7 @@ private RecordingEventHandler replayModRecording_getRecordingEventHandler() { //#endif public void replayModRecording_recordClientSound(PlayerEntity player, double x, double y, double z, SoundEvent sound, SoundCategory category, float volume, float pitch, CallbackInfo ci) { - if (player == this.client.player) { + if (player == this.mc.player) { RecordingEventHandler handler = replayModRecording_getRecordingEventHandler(); if (handler != null) { handler.onClientSound(sound, category, x, y, z, volume, pitch); @@ -128,7 +128,7 @@ private void playLevelEvent (PlayerEntity player, int type, BlockPos pos, int da //$$ @Override //$$ public void playEvent (EntityPlayer player, int type, BlockPos pos, int data) { //#endif - if (player == this.client.player) { + if (player == this.mc.player) { // We caused this event, the server won't send it to us RecordingEventHandler handler = replayModRecording_getRecordingEventHandler(); if (handler != null) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_BlockOnChunkRebuilds.java b/src/main/java/com/replaymod/mixin/Mixin_BlockOnChunkRebuilds.java index 66a25455..fe94168e 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_BlockOnChunkRebuilds.java +++ b/src/main/java/com/replaymod/mixin/Mixin_BlockOnChunkRebuilds.java @@ -3,9 +3,9 @@ //#if MC>=11500 import com.mojang.blaze3d.systems.RenderSystem; import com.replaymod.render.hooks.ForceChunkLoadingHook; -import net.minecraft.client.render.chunk.BlockBufferBuilderStorage; -import net.minecraft.client.render.chunk.ChunkBuilder; -import net.minecraft.util.thread.TaskExecutor; +import net.minecraft.client.renderer.RegionRenderCacheBuilder; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.util.concurrent.DelegatedTaskExecutor; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -20,17 +20,17 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -@Mixin(ChunkBuilder.class) +@Mixin(ChunkRenderDispatcher.class) public abstract class Mixin_BlockOnChunkRebuilds implements ForceChunkLoadingHook.IBlockOnChunkRebuilds { - @Shadow @Final private Queue threadBuffers; + @Shadow @Final private Queue freeBuilders; - @Shadow public abstract boolean upload(); + @Shadow public abstract boolean runChunkUploads(); - @Shadow @Final private TaskExecutor mailbox; + @Shadow @Final private DelegatedTaskExecutor delegatedTaskExecutor; - @Shadow protected abstract void scheduleRunTasks(); + @Shadow protected abstract void runTask(); - @Shadow @Final private Queue uploadQueue; + @Shadow @Final private Queue uploadTasks; private final Lock waitingForWorkLock = new ReentrantLock(); private final Condition newWork = waitingForWorkLock.newCondition(); private volatile boolean allDone; @@ -39,12 +39,12 @@ public abstract class Mixin_BlockOnChunkRebuilds implements ForceChunkLoadingHoo @Inject(method = "", at = @At("RETURN")) private void rememberTotalThreads(CallbackInfo ci) { - this.totalBufferCount = this.threadBuffers.size(); + this.totalBufferCount = this.freeBuilders.size(); } - @Inject(method = "scheduleRunTasks", at = @At("RETURN")) + @Inject(method = "runTask", at = @At("RETURN")) private void notifyMainThreadIfEverythingIsDone(CallbackInfo ci) { - if (this.threadBuffers.size() == this.totalBufferCount) { + if (this.freeBuilders.size() == this.totalBufferCount) { // Looks like we're done, better notify the main thread in case the previous task didn't generate an upload this.waitingForWorkLock.lock(); try { @@ -58,7 +58,7 @@ private void notifyMainThreadIfEverythingIsDone(CallbackInfo ci) { } } - @Inject(method = "scheduleUpload", at = @At("RETURN")) + @Inject(method = "uploadChunkLayer", at = @At("RETURN")) private void notifyMainThreadOfNewUpload(CallbackInfoReturnable> ci) { this.waitingForWorkLock.lock(); try { @@ -69,9 +69,9 @@ private void notifyMainThreadOfNewUpload(CallbackInfoReturnableask(reply -> () -> { - scheduleRunTasks(); - reply.send(this.threadBuffers.size() == this.totalBufferCount); + boolean allDone = this.delegatedTaskExecutor.func_213141_a(reply -> () -> { + runTask(); + reply.enqueue(this.freeBuilders.size() == this.totalBufferCount); }).join(); if (allDone) { @@ -96,7 +96,7 @@ private boolean waitForMainThreadWork() { if (this.allDone) { return true; - } else if (!this.uploadQueue.isEmpty()) { + } else if (!this.uploadTasks.isEmpty()) { return false; } else { this.newWork.awaitUninterruptibly(); @@ -115,7 +115,7 @@ public boolean uploadEverythingBlocking() { boolean allChunksBuilt; do { allChunksBuilt = waitForMainThreadWork(); - while (upload()) { + while (runChunkUploads()) { anything = true; } } while (!allChunksBuilt); diff --git a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyColorSky.java b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyColorSky.java index 758f2c32..e8abe210 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyColorSky.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyColorSky.java @@ -3,8 +3,8 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.replaymod.render.hooks.EntityRendererHandler; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.WorldRenderer; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -18,15 +18,15 @@ */ @Mixin(WorldRenderer.class) public abstract class Mixin_ChromaKeyColorSky { - @Shadow @Final private MinecraftClient client; + @Shadow @Final private Minecraft mc; //#if MC>=11400 || 10710>=MC - @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) + @Inject(method = "renderSky(Lcom/mojang/blaze3d/matrix/MatrixStack;F)V", at = @At("HEAD"), cancellable = true) //#else //$$ @Inject(method = "renderSky(FI)V", at = @At("HEAD"), cancellable = true) //#endif private void chromaKeyingSky(CallbackInfo ci) { - EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) this.client.gameRenderer).replayModRender_getHandler(); + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) this.mc.gameRenderer).replayModRender_getHandler(); if (handler != null) { ReadableColor color = handler.getSettings().getChromaKeyingColor(); if (color != null) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyDisableFog.java b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyDisableFog.java index 2c7e921a..4780310b 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyDisableFog.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyDisableFog.java @@ -2,15 +2,15 @@ import com.replaymod.core.versions.MCVer; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.BackgroundRenderer; +import net.minecraft.client.renderer.FogRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(BackgroundRenderer.class) +@Mixin(FogRenderer.class) public abstract class Mixin_ChromaKeyDisableFog { - @Inject(method = "applyFog", at = @At("HEAD"), cancellable = true) + @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true) private //#if MC>=11500 static diff --git a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyForceSky.java b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyForceSky.java index 27d08973..76afb7a8 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyForceSky.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyForceSky.java @@ -2,7 +2,7 @@ import com.replaymod.render.hooks.EntityRendererHandler; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.ModifyConstant; //#if MC>=11500 -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.renderer.WorldRenderer; //#else //$$ import net.minecraft.client.render.GameRenderer; //#endif @@ -25,10 +25,10 @@ //$$ @Mixin(GameRenderer.class) //#endif public abstract class Mixin_ChromaKeyForceSky { - @Shadow @Final private MinecraftClient client; + @Shadow @Final private Minecraft mc; //#if MC>=11500 - @ModifyConstant(method = "render", constant = @Constant(intValue = 4)) + @ModifyConstant(method = "updateCameraAndRender", constant = @Constant(intValue = 4)) //#else //#if MC>=11400 //$$ @ModifyConstant(method = "renderCenter", constant = @Constant(intValue = 4)) @@ -37,7 +37,7 @@ public abstract class Mixin_ChromaKeyForceSky { //#endif //#endif private int forceSkyWhenChromaKeying(int value) { - EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) this.client.gameRenderer).replayModRender_getHandler(); + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) this.mc.gameRenderer).replayModRender_getHandler(); if (handler != null) { ReadableColor color = handler.getSettings().getChromaKeyingColor(); if (color != null) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_ContextualKeyBindings.java b/src/main/java/com/replaymod/mixin/Mixin_ContextualKeyBindings.java index 5674ba6b..ec96781c 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ContextualKeyBindings.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ContextualKeyBindings.java @@ -2,7 +2,7 @@ import com.replaymod.core.ReplayMod; import com.replaymod.replay.ReplayModReplay; -import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.settings.KeyBinding; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -25,8 +25,8 @@ @Mixin(KeyBinding.class) public class Mixin_ContextualKeyBindings { //#if MC>=11200 - @Shadow @Final private static Map keysById; - @Unique private static Collection keyBindings() { return Mixin_ContextualKeyBindings.keysById.values(); } + @Shadow @Final private static Map KEYBIND_ARRAY; + @Unique private static Collection keyBindings() { return Mixin_ContextualKeyBindings.KEYBIND_ARRAY.values(); } //#else //$$ @Shadow @Final private static List KEYBIND_ARRAY; //$$ @Unique private static Collection keyBindings() { return Mixin_ContextualKeyBindings.KEYBIND_ARRAY; } @@ -34,7 +34,7 @@ public class Mixin_ContextualKeyBindings { @Unique private static final List temporarilyRemoved = new ArrayList<>(); - @Inject(method = "updateKeysByCode", at = @At("HEAD")) + @Inject(method = "resetKeyBindingArrayAndHash", at = @At("HEAD")) private static void preContextualKeyBindings(CallbackInfo ci) { ReplayMod mod = ReplayMod.instance; if (mod == null) { @@ -45,7 +45,7 @@ private static void preContextualKeyBindings(CallbackInfo ci) { // In replay, remove any conflicting key bindings, so that ours are guaranteed in keyBindings().removeIf(keyBinding -> { for (KeyBinding exclusiveBinding : onlyInReplay) { - if (keyBinding.equals(exclusiveBinding) && keyBinding != exclusiveBinding) { + if (keyBinding.conflicts(exclusiveBinding) && keyBinding != exclusiveBinding) { temporarilyRemoved.add(keyBinding); return true; } @@ -64,11 +64,11 @@ private static void preContextualKeyBindings(CallbackInfo ci) { } } - @Inject(method = "updateKeysByCode", at = @At("RETURN")) + @Inject(method = "resetKeyBindingArrayAndHash", at = @At("RETURN")) private static void postContextualKeyBindings(CallbackInfo ci) { for (KeyBinding keyBinding : temporarilyRemoved) { //#if MC>=11200 - Mixin_ContextualKeyBindings.keysById.put(keyBinding.getTranslationKey(), keyBinding); + Mixin_ContextualKeyBindings.KEYBIND_ARRAY.put(keyBinding.getKeyDescription(), keyBinding); //#else //$$ keyBindings().add(keyBinding); //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_EntityLivingBaseAccessor.java b/src/main/java/com/replaymod/mixin/Mixin_EntityLivingBaseAccessor.java index 34584d65..b22b4e5f 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_EntityLivingBaseAccessor.java +++ b/src/main/java/com/replaymod/mixin/Mixin_EntityLivingBaseAccessor.java @@ -7,22 +7,22 @@ @Mixin(LivingEntity.class) public interface Mixin_EntityLivingBaseAccessor { //#if MC>=11400 - @Accessor("serverX") + @Accessor double getInterpTargetX(); - @Accessor("serverY") + @Accessor double getInterpTargetY(); - @Accessor("serverZ") + @Accessor double getInterpTargetZ(); - @Accessor("serverYaw") + @Accessor double getInterpTargetYaw(); - @Accessor("serverPitch") + @Accessor double getInterpTargetPitch(); //#endif //#if MC>=10904 - @Accessor("itemUseTimeLeft") + @Accessor int getActiveItemStackUseCount(); - @Accessor("itemUseTimeLeft") + @Accessor void setActiveItemStackUseCount(int value); //#endif } diff --git a/src/main/java/com/replaymod/mixin/Mixin_ForceChunkLoading.java b/src/main/java/com/replaymod/mixin/Mixin_ForceChunkLoading.java index bd9b32c4..a140bd2c 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ForceChunkLoading.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ForceChunkLoading.java @@ -3,10 +3,10 @@ import com.replaymod.compat.shaders.ShaderReflection; import com.replaymod.render.hooks.ForceChunkLoadingHook; import com.replaymod.render.hooks.IForceChunkLoading; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.render.chunk.ChunkBuilder; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.culling.ClippingHelper; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -24,19 +24,19 @@ public void replayModRender_setHook(ForceChunkLoadingHook hook) { this.replayModRender_hook = hook; } - @Shadow private Set chunksToRebuild; + @Shadow private Set chunksToUpdate; - @Shadow private ChunkBuilder chunkBuilder; + @Shadow private ChunkRenderDispatcher renderDispatcher; - @Shadow private boolean needsTerrainUpdate; + @Shadow private boolean displayListEntitiesDirty; - @Shadow protected abstract void setupTerrain(Camera camera_1, Frustum frustum_1, boolean boolean_1, int int_1, boolean boolean_2); + @Shadow protected abstract void setupTerrain(ActiveRenderInfo camera_1, ClippingHelper frustum_1, boolean boolean_1, int int_1, boolean boolean_2); - @Shadow private int frame; + @Shadow private int frameId; private boolean passThrough; @Inject(method = "setupTerrain", at = @At("HEAD"), cancellable = true) - private void forceAllChunks(Camera camera_1, Frustum frustum_1, boolean boolean_1, int int_1, boolean boolean_2, CallbackInfo ci) throws IllegalAccessException { + private void forceAllChunks(ActiveRenderInfo camera_1, ClippingHelper frustum_1, boolean boolean_1, int int_1, boolean boolean_2, CallbackInfo ci) throws IllegalAccessException { if (replayModRender_hook == null) { return; } @@ -52,24 +52,24 @@ private void forceAllChunks(Camera camera_1, Frustum frustum_1, boolean boolean_ try { do { // Determine which chunks shall be visible - setupTerrain(camera_1, frustum_1, boolean_1, this.frame++, boolean_2); + setupTerrain(camera_1, frustum_1, boolean_1, this.frameId++, boolean_2); // Schedule all chunks which need rebuilding (we schedule even important rebuilds because we wait for // all of them anyway and this way we can take advantage of threading) - for (ChunkBuilder.BuiltChunk builtChunk : this.chunksToRebuild) { + for (ChunkRenderDispatcher.ChunkRender builtChunk : this.chunksToUpdate) { // MC sometimes schedules invalid chunks when you're outside of loaded chunks (e.g. y > 256) - if (builtChunk.shouldBuild()) { - builtChunk.scheduleRebuild(this.chunkBuilder); + if (builtChunk.shouldStayLoaded()) { + builtChunk.rebuildChunkLater(this.renderDispatcher); } - builtChunk.cancelRebuild(); + builtChunk.clearNeedsUpdate(); } - this.chunksToRebuild.clear(); + this.chunksToUpdate.clear(); // Upload all chunks - this.needsTerrainUpdate |= ((ForceChunkLoadingHook.IBlockOnChunkRebuilds) this.chunkBuilder).uploadEverythingBlocking(); + this.displayListEntitiesDirty |= ((ForceChunkLoadingHook.IBlockOnChunkRebuilds) this.renderDispatcher).uploadEverythingBlocking(); // Repeat until no more updates are needed - } while (this.needsTerrainUpdate); + } while (this.displayListEntitiesDirty); } finally { passThrough = false; } diff --git a/src/main/java/com/replaymod/mixin/Mixin_HideDynamicResourcePacks.java b/src/main/java/com/replaymod/mixin/Mixin_HideDynamicResourcePacks.java index 98937c72..8dc59b4b 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_HideDynamicResourcePacks.java +++ b/src/main/java/com/replaymod/mixin/Mixin_HideDynamicResourcePacks.java @@ -1,37 +1,37 @@ //#if FABRIC>=1 -package com.replaymod.mixin; - -import net.minecraft.client.gui.screen.pack.PackListWidget; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - +//$$ package com.replaymod.mixin; +//$$ +//$$ import net.minecraft.client.gui.screen.pack.PackListWidget; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ //#if MC>=11600 -import net.minecraft.client.gui.screen.pack.PackScreen; -import net.minecraft.client.gui.screen.pack.ResourcePackOrganizer; +//$$ import net.minecraft.client.gui.screen.pack.PackScreen; +//$$ import net.minecraft.client.gui.screen.pack.ResourcePackOrganizer; //#else //$$ import net.minecraft.client.resource.ClientResourcePackProfile; //#endif - +//$$ //#if MC>=11600 -@Mixin(PackScreen.class) +//$$ @Mixin(PackScreen.class) //#else //$$ @Mixin(ResourcePackListWidget.class) //#endif -public abstract class Mixin_HideDynamicResourcePacks { +//$$ public abstract class Mixin_HideDynamicResourcePacks { //#if MC>=11600 - @Inject(method = "method_29672", at = @At("HEAD"), cancellable = true) - private void hideInternalPacks(PackListWidget packListWidget, ResourcePackOrganizer.Pack pack, CallbackInfo info) { + //$$ @Inject(method = "method_29672", at = @At("HEAD"), cancellable = true) + //$$ private void hideInternalPacks(PackListWidget packListWidget, ResourcePackOrganizer.Pack pack, CallbackInfo info) { //#else //$$ @Inject(method = "add", at = @At("HEAD"), cancellable = true) //$$ private void hideInternalPacks(ResourcePackListWidget.ResourcePackEntry entry, CallbackInfo info) { //$$ ClientResourcePackProfile pack = entry.getPack(); //#endif - String name = pack.getDisplayName().asString(); - if (name.equals("replaymod_lang") || name.equals("replaymod_jgui")) { - info.cancel(); - } - } -} +//$$ String name = pack.getDisplayName().asString(); +//$$ if (name.equals("replaymod_lang") || name.equals("replaymod_jgui")) { +//$$ info.cancel(); +//$$ } +//$$ } +//$$ } //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_HideNameTags.java b/src/main/java/com/replaymod/mixin/Mixin_HideNameTags.java index 574b52a3..fbdd1b79 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_HideNameTags.java +++ b/src/main/java/com/replaymod/mixin/Mixin_HideNameTags.java @@ -2,7 +2,7 @@ import com.replaymod.core.versions.MCVer; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -11,7 +11,7 @@ @Mixin(EntityRenderer.class) public abstract class Mixin_HideNameTags { //#if MC>=11500 - @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true) + @Inject(method = "renderName", at = @At("HEAD"), cancellable = true) //#else //#if MC>=11400 //$$ @Inject(method = "renderLabel(Lnet/minecraft/entity/Entity;Ljava/lang/String;DDDI)V", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/com/replaymod/mixin/Mixin_HideNameTags_LivingEntity.java b/src/main/java/com/replaymod/mixin/Mixin_HideNameTags_LivingEntity.java index 33c6837a..1a083df4 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_HideNameTags_LivingEntity.java +++ b/src/main/java/com/replaymod/mixin/Mixin_HideNameTags_LivingEntity.java @@ -1,9 +1,9 @@ package com.replaymod.mixin; -import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.LivingRenderer; import org.spongepowered.asm.mixin.Mixin; -@Mixin(LivingEntityRenderer.class) +@Mixin(LivingRenderer.class) public abstract class Mixin_HideNameTags_LivingEntity { // 1.8.9 and below } diff --git a/src/main/java/com/replaymod/mixin/Mixin_KeyboardListener.java b/src/main/java/com/replaymod/mixin/Mixin_KeyboardListener.java index dc9ec264..bd5ab242 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_KeyboardListener.java +++ b/src/main/java/com/replaymod/mixin/Mixin_KeyboardListener.java @@ -8,27 +8,27 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC>=11400 -import net.minecraft.client.Keyboard; +import net.minecraft.client.KeyboardListener; //#else //$$ import net.minecraft.client.Minecraft; //#endif //#if MC>=11400 -@Mixin(Keyboard.class) +@Mixin(KeyboardListener.class) //#else //$$ @Mixin(Minecraft.class) //#endif public abstract class Mixin_KeyboardListener { @Inject( //#if MC>=11400 - method = "onKey", + method = "onKeyEvent", //#else //$$ method = "dispatchKeypresses", //#endif at = @At( value = "INVOKE", //#if MC>=11400 - target = "Lnet/minecraft/client/util/ScreenshotUtils;saveScreenshot(Ljava/io/File;IILnet/minecraft/client/gl/Framebuffer;Ljava/util/function/Consumer;)V" + target = "Lnet/minecraft/util/ScreenShotHelper;saveScreenshot(Ljava/io/File;IILnet/minecraft/client/shader/Framebuffer;Ljava/util/function/Consumer;)V" //#else //#if MC>=11400 //$$ target = "Lnet/minecraft/util/ScreenShotHelper;saveScreenshot(Ljava/io/File;IILnet/minecraft/client/shader/Framebuffer;Ljava/util/function/Consumer;)V" diff --git a/src/main/java/com/replaymod/mixin/Mixin_MoveRealmsButton.java b/src/main/java/com/replaymod/mixin/Mixin_MoveRealmsButton.java index 336adfe9..829b89c7 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_MoveRealmsButton.java +++ b/src/main/java/com/replaymod/mixin/Mixin_MoveRealmsButton.java @@ -4,16 +4,16 @@ import com.replaymod.core.ReplayMod; import com.replaymod.replay.Setting; import com.replaymod.replay.handler.GuiHandler.MainMenuButtonPosition; -import net.minecraft.client.gui.screen.TitleScreen; +import net.minecraft.client.gui.screen.MainMenuScreen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; -@Mixin(TitleScreen.class) +@Mixin(MainMenuScreen.class) public abstract class Mixin_MoveRealmsButton { @ModifyArg( method = "init", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;init(Lnet/minecraft/client/MinecraftClient;II)V"), + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;init(Lnet/minecraft/client/Minecraft;II)V"), index = 2 ) private int adjustRealmsButton(int height) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Camera.java b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Camera.java index 3b86ff0a..b285cf23 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Camera.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Camera.java @@ -1,15 +1,15 @@ package com.replaymod.mixin; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.util.math.Matrix4f; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.util.math.vector.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(GameRenderer.class) public abstract class Mixin_Omnidirectional_Camera implements EntityRendererHandler.IEntityRenderer { - @Redirect(method = "method_22973", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/Matrix4f;viewboxMatrix(DFFF)Lnet/minecraft/util/math/Matrix4f;")) + @Redirect(method = "method_22973", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/vector/Matrix4f;perspective(DFFF)Lnet/minecraft/util/math/vector/Matrix4f;")) private Matrix4f replayModRender_perspective$0(double fovY, float aspect, float zNear, float zFar) { return replayModRender_perspective((float) fovY, aspect, zNear, zFar); } @@ -19,6 +19,6 @@ private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNe fovY = 90; aspect = 1; } - return Matrix4f.viewboxMatrix(fovY, aspect, zNear, zFar); + return Matrix4f.perspective(fovY, aspect, zNear, zFar); } } diff --git a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_DisableFrustumCulling.java b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_DisableFrustumCulling.java index 58911974..41c1cae7 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_DisableFrustumCulling.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_DisableFrustumCulling.java @@ -8,19 +8,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; //#if MC>=10800 -import net.minecraft.client.render.Frustum; +import net.minecraft.client.renderer.culling.ClippingHelper; //#else //$$ import net.minecraft.client.renderer.culling.Frustrum; //#endif //#if MC>=10800 -@Mixin(Frustum.class) +@Mixin(ClippingHelper.class) //#else //$$ @Mixin(Frustrum.class) //#endif public abstract class Mixin_Omnidirectional_DisableFrustumCulling { //#if MC>=11500 - @Inject(method = "isAnyCornerVisible", at = @At("HEAD"), cancellable = true) + @Inject(method = "isBoxInFrustumRaw", at = @At("HEAD"), cancellable = true) //#else //$$ @Inject(method = "intersects", at = @At("HEAD"), cancellable = true) //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Rotation.java b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Rotation.java index 9bd36f4d..77844024 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Rotation.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Rotation.java @@ -8,8 +8,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC>=11500 -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.client.util.math.Vector3f; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.util.math.vector.Vector3f; //#else //$$ import org.lwjgl.opengl.GL11; //#endif @@ -17,7 +17,7 @@ import static com.replaymod.core.versions.MCVer.getMinecraft; //#if MC>=11500 -@Mixin(value = net.minecraft.client.render.GameRenderer.class) +@Mixin(value = net.minecraft.client.renderer.GameRenderer.class) //#else //#if MC>=11400 //$$ @Mixin(value = net.minecraft.client.render.Camera.class) @@ -79,7 +79,7 @@ private void replayModRender_setupCubicFrameRotation( break; } //#if MC>=11500 - matrixStack.multiply(new Vector3f(x, y, 0).getDegreesQuaternion(angle)); + matrixStack.rotate(new Vector3f(x, y, 0).rotationDegrees(angle)); //#else //$$ GL11.glRotatef(angle, x, y, 0); //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_SkipHand.java b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_SkipHand.java index 135d6fab..7ed371a3 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_SkipHand.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_SkipHand.java @@ -1,9 +1,9 @@ package com.replaymod.mixin; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.GameRenderer; +import com.mojang.blaze3d.matrix.MatrixStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -17,7 +17,7 @@ private void replayModRender_renderSpectatorHand( MatrixStack matrixStack, //#endif //#if MC>=11400 - Camera camera, + ActiveRenderInfo camera, //#endif float partialTicks, //#if MC<11400 diff --git a/src/main/java/com/replaymod/mixin/Mixin_ParticleManager.java b/src/main/java/com/replaymod/mixin/Mixin_ParticleManager.java index f7d096ac..8089abe3 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ParticleManager.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ParticleManager.java @@ -21,7 +21,7 @@ @Mixin(ParticleManager.class) public abstract class Mixin_ParticleManager { @Final @Shadow - private Queue newParticles; + private Queue queue; /** * This method additionally clears the queue of particles to be added when the world is changed. @@ -31,7 +31,7 @@ public abstract class Mixin_ParticleManager { * @param world The new world * @param ci Callback info */ - @Inject(method = "setWorld", at = @At("HEAD")) + @Inject(method = "clearEffects", at = @At("HEAD")) public void replayModReplay_clearParticleQueue( //#if MC>=11600 ClientWorld world, @@ -39,7 +39,7 @@ public void replayModReplay_clearParticleQueue( //$$ World world, //#endif CallbackInfo ci) { - this.newParticles.clear(); + this.queue.clear(); } } //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_PlayerControllerMP.java b/src/main/java/com/replaymod/mixin/Mixin_PlayerControllerMP.java index 95ca44d5..9a9ed64f 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_PlayerControllerMP.java +++ b/src/main/java/com/replaymod/mixin/Mixin_PlayerControllerMP.java @@ -2,9 +2,9 @@ import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.camera.CameraEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.PlayerController; +import net.minecraft.client.network.play.ClientPlayNetHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -19,40 +19,40 @@ //#if MC>=11200 //#if MC>=11400 -import net.minecraft.client.recipebook.ClientRecipeBook; +import net.minecraft.client.util.ClientRecipeBook; //#else //$$ import net.minecraft.stats.RecipeBook; //#endif //#endif //#if MC>=10904 -import net.minecraft.stat.StatHandler; +import net.minecraft.stats.StatisticsManager; //#else //$$ import net.minecraft.stats.StatFileWriter; //#endif //#if MC>=10800 -import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.entity.player.ClientPlayerEntity; //#else //$$ import net.minecraft.client.entity.EntityClientPlayerMP; //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#endif -@Mixin(ClientPlayerInteractionManager.class) +@Mixin(PlayerController.class) public abstract class Mixin_PlayerControllerMP { @Shadow - private MinecraftClient client; + private Minecraft mc; @Shadow //#if MC>=10904 - private ClientPlayNetworkHandler networkHandler; + private ClientPlayNetHandler connection; //#else //$$ private NetHandlerPlayClient netClientHandler; //#endif //#if MC>=11400 //#if MC>=11602 - @Inject(method = "createPlayer(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/stat/StatHandler;Lnet/minecraft/client/recipebook/ClientRecipeBook;ZZ)Lnet/minecraft/client/network/ClientPlayerEntity;", at=@At("HEAD"), cancellable = true) + @Inject(method = "createPlayer(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/stats/StatisticsManager;Lnet/minecraft/client/util/ClientRecipeBook;ZZ)Lnet/minecraft/client/entity/player/ClientPlayerEntity;", at=@At("HEAD"), cancellable = true) //#else //$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true) //#endif @@ -62,7 +62,7 @@ private void replayModReplay_createReplayCamera( //#else //$$ World worldIn, //#endif - StatHandler statisticsManager, + StatisticsManager statisticsManager, ClientRecipeBook recipeBookClient, //#if MC>=11600 boolean lastIsHoldingSneakKey, @@ -71,7 +71,7 @@ private void replayModReplay_createReplayCamera( CallbackInfoReturnable ci ) { if (ReplayModReplay.instance.getReplayHandler() != null) { - ci.setReturnValue(new CameraEntity(this.client, worldIn, this.networkHandler, statisticsManager, recipeBookClient)); + ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.connection, statisticsManager, recipeBookClient)); //#else //#if MC>=11200 //$$ @Inject(method = "func_192830_a", at=@At("HEAD"), cancellable = true) @@ -105,13 +105,13 @@ private void replayModReplay_createReplayCamera( //#if MC>=10800 //#if MC>=11400 - @Inject(method = "isFlyingLocked", at=@At("HEAD"), cancellable = true) + @Inject(method = "isSpectatorMode", at=@At("HEAD"), cancellable = true) //#else //$$ @Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true) //#endif private void replayModReplay_isSpectator(CallbackInfoReturnable ci) { - if (this.client.player instanceof CameraEntity) { // this check should in theory not be required - ci.setReturnValue(this.client.player.isSpectator()); + if (this.mc.player instanceof CameraEntity) { // this check should in theory not be required + ci.setReturnValue(this.mc.player.isSpectator()); } } //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_PreserveDepthDuringHandRendering.java b/src/main/java/com/replaymod/mixin/Mixin_PreserveDepthDuringHandRendering.java index 6e97618a..d587ff98 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_PreserveDepthDuringHandRendering.java +++ b/src/main/java/com/replaymod/mixin/Mixin_PreserveDepthDuringHandRendering.java @@ -1,7 +1,7 @@ package com.replaymod.mixin; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.renderer.GameRenderer; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/com/replaymod/mixin/Mixin_RegisterDynamicResourcePacks.java b/src/main/java/com/replaymod/mixin/Mixin_RegisterDynamicResourcePacks.java index 2648240c..550dcf70 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RegisterDynamicResourcePacks.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RegisterDynamicResourcePacks.java @@ -1,56 +1,56 @@ //#if FABRIC>=1 -package com.replaymod.mixin; - -import com.replaymod.core.ReplayMod; -import com.replaymod.core.versions.LangResourcePack; -import net.minecraft.client.resource.ClientBuiltinResourcePackProvider; -import net.minecraft.resource.ResourcePackProfile; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.function.Consumer; - +//$$ package com.replaymod.mixin; +//$$ +//$$ import com.replaymod.core.ReplayMod; +//$$ import com.replaymod.core.versions.LangResourcePack; +//$$ import net.minecraft.client.resource.ClientBuiltinResourcePackProvider; +//$$ import net.minecraft.resource.ResourcePackProfile; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ +//$$ import java.util.function.Consumer; +//$$ //#if MC>=11600 -import net.minecraft.resource.ResourcePackSource; +//$$ import net.minecraft.resource.ResourcePackSource; //#else //$$ import java.util.Map; //#endif - -@Mixin(ClientBuiltinResourcePackProvider.class) -public class Mixin_RegisterDynamicResourcePacks { - @Inject(method = "register", at = @At("RETURN")) +//$$ +//$$ @Mixin(ClientBuiltinResourcePackProvider.class) +//$$ public class Mixin_RegisterDynamicResourcePacks { +//$$ @Inject(method = "register", at = @At("RETURN")) //#if MC>=11600 - private void registerReplayMod(Consumer consumer, ResourcePackProfile.Factory factory, CallbackInfo ci) { + //$$ private void registerReplayMod(Consumer consumer, ResourcePackProfile.Factory factory, CallbackInfo ci) { //#else //$$ private void registerReplayMod(Map map, ResourcePackProfile.Factory factory, CallbackInfo ci) { //$$ Consumer consumer = (pack) -> map.put(pack.getName(), pack); //#endif - - consumer.accept(ResourcePackProfile.of( - LangResourcePack.NAME, - true, - LangResourcePack::new, - factory, - ResourcePackProfile.InsertionPosition.BOTTOM +//$$ +//$$ consumer.accept(ResourcePackProfile.of( +//$$ LangResourcePack.NAME, +//$$ true, +//$$ LangResourcePack::new, +//$$ factory, +//$$ ResourcePackProfile.InsertionPosition.BOTTOM //#if MC>=11600 - , ResourcePackSource.PACK_SOURCE_BUILTIN + //$$ , ResourcePackSource.PACK_SOURCE_BUILTIN //#endif - )); - - if (ReplayMod.jGuiResourcePack != null) { - consumer.accept(ResourcePackProfile.of( - ReplayMod.JGUI_RESOURCE_PACK_NAME, - true, - () -> ReplayMod.jGuiResourcePack, - factory, - ResourcePackProfile.InsertionPosition.BOTTOM +//$$ )); +//$$ +//$$ if (ReplayMod.jGuiResourcePack != null) { +//$$ consumer.accept(ResourcePackProfile.of( +//$$ ReplayMod.JGUI_RESOURCE_PACK_NAME, +//$$ true, +//$$ () -> ReplayMod.jGuiResourcePack, +//$$ factory, +//$$ ResourcePackProfile.InsertionPosition.BOTTOM //#if MC>=11600 - , ResourcePackSource.PACK_SOURCE_BUILTIN + //$$ , ResourcePackSource.PACK_SOURCE_BUILTIN //#endif - )); - } - } -} +//$$ )); +//$$ } +//$$ } +//$$ } //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderGlobal.java b/src/main/java/com/replaymod/mixin/Mixin_RenderGlobal.java index 8e9eb55d..7bab3856 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderGlobal.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderGlobal.java @@ -10,19 +10,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#if MC>=11500 -import net.minecraft.client.render.Frustum; +import net.minecraft.client.renderer.culling.ClippingHelper; //#else //$$ import net.minecraft.client.render.VisibleRegion; //#endif //#if MC>=11400 -import net.minecraft.client.render.Camera; +import net.minecraft.client.renderer.ActiveRenderInfo; //#else //$$ import net.minecraft.entity.Entity; //#endif //#if MC>=11400 -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.renderer.WorldRenderer; //#else //$$ import net.minecraft.client.renderer.RenderGlobal; //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderHudCallback.java b/src/main/java/com/replaymod/mixin/Mixin_RenderHudCallback.java index 874ed1ac..d1adca1c 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderHudCallback.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderHudCallback.java @@ -1,32 +1,32 @@ //#if FABRIC>=1 -package com.replaymod.mixin; - -import com.replaymod.gui.versions.callbacks.RenderHudCallback; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.util.math.MatrixStack; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(InGameHud.class) -public class Mixin_RenderHudCallback { - @Inject( - method = "render", - at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/client/options/GameOptions;debugEnabled:Z" - ) - ) +//$$ package com.replaymod.mixin; +//$$ +//$$ import com.replaymod.gui.versions.callbacks.RenderHudCallback; +//$$ import net.minecraft.client.gui.hud.InGameHud; +//$$ import net.minecraft.client.util.math.MatrixStack; +//$$ import org.objectweb.asm.Opcodes; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ +//$$ @Mixin(InGameHud.class) +//$$ public class Mixin_RenderHudCallback { +//$$ @Inject( +//$$ method = "render", +//$$ at = @At( +//$$ value = "FIELD", +//$$ opcode = Opcodes.GETFIELD, +//$$ target = "Lnet/minecraft/client/options/GameOptions;debugEnabled:Z" +//$$ ) +//$$ ) //#if MC>=11600 - private void renderOverlay(MatrixStack stack, float partialTicks, CallbackInfo ci) { + //$$ private void renderOverlay(MatrixStack stack, float partialTicks, CallbackInfo ci) { //#else //$$ private void renderOverlay(float partialTicks, CallbackInfo ci) { //$$ MatrixStack stack = new MatrixStack(); //#endif - RenderHudCallback.EVENT.invoker().renderHud(stack, partialTicks); - } -} +//$$ RenderHudCallback.EVENT.invoker().renderHud(stack, partialTicks); +//$$ } +//$$ } //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderItem.java b/src/main/java/com/replaymod/mixin/Mixin_RenderItem.java index 492537fa..9be66cac 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderItem.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderItem.java @@ -13,14 +13,14 @@ //#endif //#if MC>=11500 -@Mixin(net.minecraft.client.render.RenderPhase.class) +@Mixin(net.minecraft.client.renderer.RenderState.class) //#else //$$ @Mixin(net.minecraft.client.render.item.ItemRenderer.class) //#endif public class Mixin_RenderItem { //#if MC>=11400 //#if MC>=11500 - @Redirect(method = "setupGlintTexturing", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;getMeasuringTimeMs()J")) + @Redirect(method = "setupGlintTexturing", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;milliTime()J")) //#else //#if MC>=11400 //$$ @Redirect(method = "renderGlint", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;getMeasuringTimeMs()J")) @@ -38,7 +38,7 @@ private static long getEnchantmentTime() { return replayHandler.getReplaySender().currentTimeStamp(); } //#if MC>=11400 - return Util.getMeasuringTimeMs(); + return Util.milliTime(); //#else //$$ return Minecraft.getSystemTime(); //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderLivingBase.java b/src/main/java/com/replaymod/mixin/Mixin_RenderLivingBase.java index 8970ef8a..f6b2227e 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderLivingBase.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderLivingBase.java @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; //#if MC>=10904 -import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.LivingRenderer; //#else //$$ import net.minecraft.client.renderer.entity.RendererLivingEntity; //#endif @@ -18,15 +18,15 @@ import static com.replaymod.core.versions.MCVer.*; //#if MC>=10904 -@Mixin(LivingEntityRenderer.class) +@Mixin(LivingRenderer.class) //#else //$$ @Mixin(RendererLivingEntity.class) //#endif public abstract class Mixin_RenderLivingBase { //#if FABRIC>=1 - @Inject(method = "hasLabel", at = @At("HEAD"), cancellable = true) + //$$ @Inject(method = "hasLabel", at = @At("HEAD"), cancellable = true) //#else - //$$ @Inject(method = "canRenderName(Lnet/minecraft/entity/LivingEntity;)Z", at = @At("HEAD"), cancellable = true) + @Inject(method = "canRenderName(Lnet/minecraft/entity/LivingEntity;)Z", at = @At("HEAD"), cancellable = true) //#endif private void replayModReplay_canRenderInvisibleName(LivingEntity entity, CallbackInfoReturnable ci) { PlayerEntity thePlayer = getMinecraft().player; @@ -51,6 +51,6 @@ private void replayModReplay_canRenderInvisibleName(LivingEntity entity, Callbac ) ) private boolean replayModReplay_shouldInvisibleNotBeRendered(LivingEntity entity, PlayerEntity thePlayer) { - return thePlayer instanceof CameraEntity || entity.isInvisibleTo(thePlayer); + return thePlayer instanceof CameraEntity || entity.isInvisibleToPlayer(thePlayer); } } diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderManager.java b/src/main/java/com/replaymod/mixin/Mixin_RenderManager.java index 9b28b73a..fd57653e 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderManager.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderManager.java @@ -3,15 +3,15 @@ import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.EntityExporter; -import net.minecraft.client.render.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererManager; 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; //#if MC>=11500 -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import com.mojang.blaze3d.matrix.MatrixStack; //#endif //#if MC>=10904 @@ -20,12 +20,12 @@ //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; //#endif -@Mixin(EntityRenderDispatcher.class) +@Mixin(EntityRendererManager.class) public abstract class Mixin_RenderManager { @Inject( //#if MC>=11500 - method = "render", + method = "renderEntityStatic", //#else //#if MC>=11400 && FABRIC>=1 //$$ method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", @@ -39,14 +39,14 @@ public abstract class Mixin_RenderManager { //#endif at = @At(value = "INVOKE", //#if MC>=11500 - target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V")) + target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;FFLcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;I)V")) //#else //$$ target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;DDDFF)V")) //#endif public void preRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, //#if MC>=11500 MatrixStack matrixStack, - VertexConsumerProvider vertexConsumerProvider, + IRenderTypeBuffer vertexConsumerProvider, int int_1, //#else //$$ boolean box, @@ -64,7 +64,7 @@ public void preRender(Entity entity, double x, double y, double z, float yaw, fl @Inject( //#if MC>=11500 - method = "render", + method = "renderEntityStatic", //#else //#if MC>=11400 //$$ method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", @@ -78,7 +78,7 @@ public void preRender(Entity entity, double x, double y, double z, float yaw, fl //#endif at = @At(value = "INVOKE", //#if MC>=11500 - target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", + target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;FFLcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;I)V", //#else //$$ target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;DDDFF)V", //#endif @@ -86,7 +86,7 @@ public void preRender(Entity entity, double x, double y, double z, float yaw, fl public void postRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, //#if MC>=11500 MatrixStack matrixStack, - VertexConsumerProvider vertexConsumerProvider, + IRenderTypeBuffer vertexConsumerProvider, int int_1, //#else //$$ boolean box, diff --git a/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_NoOF.java b/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_NoOF.java index a49962b8..5da966a3 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_NoOF.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_NoOF.java @@ -2,10 +2,10 @@ package com.replaymod.mixin; import com.replaymod.replay.camera.CameraEntity; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.world.GameMode; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.multiplayer.PlayerController; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.world.GameType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -18,16 +18,16 @@ public abstract class Mixin_ShowSpectatedHand_NoOF { method = "renderHand", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;getCurrentGameMode()Lnet/minecraft/world/GameMode;" + target = "Lnet/minecraft/client/multiplayer/PlayerController;getCurrentGameType()Lnet/minecraft/world/GameType;" ) ) - private GameMode getGameMode(ClientPlayerInteractionManager interactionManager) { + private GameType getGameMode(PlayerController interactionManager) { ClientPlayerEntity camera = getMinecraft().player; if (camera instanceof CameraEntity) { // alternative doesn't really matter, the caller only checks for equality to SPECTATOR - return camera.isSpectator() ? GameMode.SPECTATOR : GameMode.SURVIVAL; + return camera.isSpectator() ? GameType.SPECTATOR : GameType.SURVIVAL; } - return interactionManager.getCurrentGameMode(); + return interactionManager.getCurrentGameType(); } } //#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_OF.java b/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_OF.java index 57c8d0f9..b90aa9d2 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_OF.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_OF.java @@ -2,9 +2,9 @@ package com.replaymod.mixin; import com.replaymod.replay.camera.CameraEntity; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.world.GameMode; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.multiplayer.PlayerController; +import net.minecraft.world.GameType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.injection.At; @@ -27,14 +27,14 @@ public abstract class Mixin_ShowSpectatedHand_OF { private static void fakePlayerGameMode(boolean renderingHand, CallbackInfo ci) { ClientPlayerEntity camera = getMinecraft().player; if (camera instanceof CameraEntity) { - ClientPlayerInteractionManager interactionManager = getMinecraft().interactionManager; + PlayerController interactionManager = getMinecraft().playerController; assert interactionManager != null; if (renderingHand) { // alternative doesn't really matter, the caller only checks for equality to SPECTATOR - interactionManager.setGameMode(camera.isSpectator() ? GameMode.SPECTATOR : GameMode.SURVIVAL); + interactionManager.setGameType(camera.isSpectator() ? GameType.SPECTATOR : GameType.SURVIVAL); } else { // reset back to spectator (we're always in spectator during a replay) - interactionManager.setGameMode(GameMode.SPECTATOR); + interactionManager.setGameType(GameType.SPECTATOR); } } } diff --git a/src/main/java/com/replaymod/mixin/Mixin_SkipBlockOutlinesDuringRender.java b/src/main/java/com/replaymod/mixin/Mixin_SkipBlockOutlinesDuringRender.java index a8e495c8..e9396919 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_SkipBlockOutlinesDuringRender.java +++ b/src/main/java/com/replaymod/mixin/Mixin_SkipBlockOutlinesDuringRender.java @@ -1,8 +1,8 @@ package com.replaymod.mixin; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.WorldRenderer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -12,11 +12,11 @@ @Mixin(WorldRenderer.class) public abstract class Mixin_SkipBlockOutlinesDuringRender { - @Shadow @Final private MinecraftClient client; + @Shadow @Final private Minecraft mc; - @Inject(method = "drawBlockOutline", at = @At("HEAD"), cancellable = true) + @Inject(method = "drawSelectionBox", at = @At("HEAD"), cancellable = true) private void replayModRender_drawSelectionBox(CallbackInfo ci) { - if (((EntityRendererHandler.IEntityRenderer) this.client.gameRenderer).replayModRender_getHandler() != null) { + if (((EntityRendererHandler.IEntityRenderer) this.mc.gameRenderer).replayModRender_getHandler() != null) { ci.cancel(); } } diff --git a/src/main/java/com/replaymod/mixin/Mixin_StabilizeCamera.java b/src/main/java/com/replaymod/mixin/Mixin_StabilizeCamera.java index 76ca06cf..f6d0b4d0 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_StabilizeCamera.java +++ b/src/main/java/com/replaymod/mixin/Mixin_StabilizeCamera.java @@ -13,14 +13,14 @@ import static com.replaymod.core.versions.MCVer.*; //#if MC>=11400 -import net.minecraft.client.render.Camera; -import net.minecraft.world.BlockView; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.world.IBlockReader; //#else //$$ import net.minecraft.client.renderer.EntityRenderer; //#endif //#if MC>=11400 -@Mixin(value = Camera.class) +@Mixin(value = ActiveRenderInfo.class) //#else //$$ @Mixin(value = EntityRenderer.class) //#endif @@ -46,7 +46,7 @@ private EntityRendererHandler getHandler() { //#endif private void replayModRender_beforeSetupCameraTransform( //#if MC>=11400 - BlockView blockView, + IBlockReader blockView, Entity entity, boolean thirdPerson, boolean inverseView, @@ -61,14 +61,14 @@ private void replayModRender_beforeSetupCameraTransform( //#if MC<11400 //$$ Entity entity = getMinecraft().getRenderViewEntity(); //#endif - orgYaw = entity.yaw; - orgPitch = entity.pitch; - orgPrevYaw = entity.prevYaw; - orgPrevPitch = entity.prevPitch; + orgYaw = entity.rotationYaw; + orgPitch = entity.rotationPitch; + orgPrevYaw = entity.prevRotationYaw; + orgPrevPitch = entity.prevRotationPitch; orgRoll = entity instanceof CameraEntity ? ((CameraEntity) entity).roll : 0; if (entity instanceof LivingEntity) { - orgHeadYaw = ((LivingEntity) entity).headYaw; - orgPrevHeadYaw = ((LivingEntity) entity).prevHeadYaw; + orgHeadYaw = ((LivingEntity) entity).rotationYawHead; + orgPrevHeadYaw = ((LivingEntity) entity).prevRotationYawHead; } } //#if MC<11400 @@ -83,13 +83,13 @@ private void replayModRender_beforeSetupCameraTransform( //#endif RenderSettings settings = getHandler().getSettings(); if (settings.isStabilizeYaw()) { - entity.prevYaw = entity.yaw = 0; + entity.prevRotationYaw = entity.rotationYaw = 0; if (entity instanceof LivingEntity) { - ((LivingEntity) entity).prevHeadYaw = ((LivingEntity) entity).headYaw = 0; + ((LivingEntity) entity).prevRotationYawHead = ((LivingEntity) entity).rotationYawHead = 0; } } if (settings.isStabilizePitch()) { - entity.prevPitch = entity.pitch = 0; + entity.prevRotationPitch = entity.rotationPitch = 0; } if (settings.isStabilizeRoll() && entity instanceof CameraEntity) { ((CameraEntity) entity).roll = 0; @@ -104,7 +104,7 @@ private void replayModRender_beforeSetupCameraTransform( //#endif private void replayModRender_afterSetupCameraTransform( //#if MC>=11400 - BlockView blockView, + IBlockReader blockView, Entity entity, boolean thirdPerson, boolean inverseView, @@ -119,16 +119,16 @@ private void replayModRender_afterSetupCameraTransform( //#if MC<11400 //$$ Entity entity = getMinecraft().getRenderViewEntity(); //#endif - entity.yaw = orgYaw; - entity.pitch = orgPitch; - entity.prevYaw = orgPrevYaw; - entity.prevPitch = orgPrevPitch; + entity.rotationYaw = orgYaw; + entity.rotationPitch = orgPitch; + entity.prevRotationYaw = orgPrevYaw; + entity.prevRotationPitch = orgPrevPitch; if (entity instanceof CameraEntity) { ((CameraEntity) entity).roll = orgRoll; } if (entity instanceof LivingEntity) { - ((LivingEntity) entity).headYaw = orgHeadYaw; - ((LivingEntity) entity).prevHeadYaw = orgPrevHeadYaw; + ((LivingEntity) entity).rotationYawHead = orgHeadYaw; + ((LivingEntity) entity).prevRotationYawHead = orgPrevHeadYaw; } } } diff --git a/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_Camera.java b/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_Camera.java index 6ea8f21d..9994e321 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_Camera.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_Camera.java @@ -2,9 +2,9 @@ import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.Matrix4f; +import net.minecraft.client.renderer.GameRenderer; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.util.math.vector.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -18,13 +18,13 @@ private void replayModRender_setupStereoscopicProjection(CallbackInfoReturnable< if (replayModRender_getHandler() != null) { Matrix4f offset; if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { - offset = Matrix4f.translate(0.07f, 0, 0); + offset = Matrix4f.makeTranslate(0.07f, 0, 0); } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { - offset = Matrix4f.translate(-0.07f, 0, 0); + offset = Matrix4f.makeTranslate(-0.07f, 0, 0); } else { return; } - offset.multiply(ci.getReturnValue()); + offset.mul(ci.getReturnValue()); ci.setReturnValue(offset); } } diff --git a/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_HandRenderPass.java b/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_HandRenderPass.java index 090f79f4..7c835658 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_HandRenderPass.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_HandRenderPass.java @@ -1,6 +1,6 @@ package com.replaymod.mixin; -import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.renderer.GameRenderer; import org.spongepowered.asm.mixin.Mixin; @Mixin(GameRenderer.class) diff --git a/src/main/java/com/replaymod/mixin/NetworkManagerAccessor.java b/src/main/java/com/replaymod/mixin/NetworkManagerAccessor.java index 0f4cc31c..e1331079 100644 --- a/src/main/java/com/replaymod/mixin/NetworkManagerAccessor.java +++ b/src/main/java/com/replaymod/mixin/NetworkManagerAccessor.java @@ -1,11 +1,11 @@ package com.replaymod.mixin; import io.netty.channel.Channel; -import net.minecraft.network.ClientConnection; +import net.minecraft.network.NetworkManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ClientConnection.class) +@Mixin(NetworkManager.class) public interface NetworkManagerAccessor { @Accessor Channel getChannel(); diff --git a/src/main/java/com/replaymod/mixin/NetworkRegistryAccessor.java b/src/main/java/com/replaymod/mixin/NetworkRegistryAccessor.java new file mode 100644 index 00000000..d1475f9b --- /dev/null +++ b/src/main/java/com/replaymod/mixin/NetworkRegistryAccessor.java @@ -0,0 +1,16 @@ +package com.replaymod.mixin; + +import net.minecraftforge.fml.network.NetworkDirection; +import net.minecraftforge.fml.network.NetworkRegistry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.List; + +@Mixin(NetworkRegistry.class) +public interface NetworkRegistryAccessor { + @Invoker("gatherLoginPayloads") + static List invokeGatherLoginPayloads(NetworkDirection direction, boolean isLocal) { + throw new AssertionError(); + } +} diff --git a/src/main/java/com/replaymod/mixin/ParticleAccessor.java b/src/main/java/com/replaymod/mixin/ParticleAccessor.java index feab16c9..27cc3593 100644 --- a/src/main/java/com/replaymod/mixin/ParticleAccessor.java +++ b/src/main/java/com/replaymod/mixin/ParticleAccessor.java @@ -17,11 +17,11 @@ public interface ParticleAccessor double getPrevPosY(); @Accessor double getPrevPosZ(); - @Accessor("x") + @Accessor double getPosX(); - @Accessor("y") + @Accessor double getPosY(); - @Accessor("z") + @Accessor double getPosZ(); //#endif } diff --git a/src/main/java/com/replaymod/mixin/SPacketSpawnMobAccessor.java b/src/main/java/com/replaymod/mixin/SPacketSpawnMobAccessor.java index d3bfbd0a..0954371a 100644 --- a/src/main/java/com/replaymod/mixin/SPacketSpawnMobAccessor.java +++ b/src/main/java/com/replaymod/mixin/SPacketSpawnMobAccessor.java @@ -1,11 +1,11 @@ package com.replaymod.mixin; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.network.packet.s2c.play.MobSpawnS2CPacket; +import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.network.play.server.SSpawnMobPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(MobSpawnS2CPacket.class) +@Mixin(SSpawnMobPacket.class) public interface SPacketSpawnMobAccessor { //#if MC<11500 //$$ @Accessor("dataTracker") diff --git a/src/main/java/com/replaymod/mixin/SPacketSpawnPlayerAccessor.java b/src/main/java/com/replaymod/mixin/SPacketSpawnPlayerAccessor.java index 8a6e2cfc..ea2742d7 100644 --- a/src/main/java/com/replaymod/mixin/SPacketSpawnPlayerAccessor.java +++ b/src/main/java/com/replaymod/mixin/SPacketSpawnPlayerAccessor.java @@ -1,11 +1,11 @@ package com.replaymod.mixin; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.network.packet.s2c.play.PlayerSpawnS2CPacket; +import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.network.play.server.SSpawnPlayerPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(PlayerSpawnS2CPacket.class) +@Mixin(SSpawnPlayerPacket.class) public interface SPacketSpawnPlayerAccessor { //#if MC<11500 //$$ @Accessor("dataTracker") diff --git a/src/main/java/com/replaymod/mixin/TimerAccessor.java b/src/main/java/com/replaymod/mixin/TimerAccessor.java index 4757b05b..d68c5594 100644 --- a/src/main/java/com/replaymod/mixin/TimerAccessor.java +++ b/src/main/java/com/replaymod/mixin/TimerAccessor.java @@ -1,20 +1,20 @@ package com.replaymod.mixin; -import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.util.Timer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(RenderTickCounter.class) +@Mixin(Timer.class) public interface TimerAccessor { - @Accessor("prevTimeMillis") + @Accessor long getLastSyncSysClock(); - @Accessor("prevTimeMillis") + @Accessor void setLastSyncSysClock(long value); //#if MC>=11200 - @Accessor("tickTime") + @Accessor float getTickLength(); - @Accessor("tickTime") + @Accessor void setTickLength(float value); //#else //$$ @Accessor diff --git a/src/main/java/com/replaymod/mixin/WorldRendererAccessor.java b/src/main/java/com/replaymod/mixin/WorldRendererAccessor.java index 99a1eb2d..721537a0 100644 --- a/src/main/java/com/replaymod/mixin/WorldRendererAccessor.java +++ b/src/main/java/com/replaymod/mixin/WorldRendererAccessor.java @@ -1,16 +1,16 @@ package com.replaymod.mixin; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.renderer.WorldRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import java.util.Set; //#if MC>=10800 -import net.minecraft.client.render.chunk.ChunkBuilder; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; //#if MC>=11500 -import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.ChunkRender; //#else //$$ import net.minecraft.client.render.chunk.ChunkRenderer; //#endif diff --git a/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java b/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java index 71439b22..37368a75 100644 --- a/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java +++ b/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java @@ -35,7 +35,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.crash.CrashReport; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -109,7 +109,7 @@ public void consume(String obj) { public final GuiButton loadButton = new GuiButton().onClick(new Runnable() { @Override public void run() { - getMinecraft().openScreen(null); + getMinecraft().displayGuiScreen(null); try { Timeline timeline = timelines.get(selectedEntries.iterator().next().name); for (Path path : timeline.getPaths()) { @@ -185,7 +185,7 @@ public void run() { setClipboardString(serialization.serialize(toBeSerialized)); } catch (Throwable t) { t.printStackTrace(); - CrashReport report = CrashReport.create(t, "Copying timeline(s)"); + CrashReport report = CrashReport.makeCrashReport(t, "Copying timeline(s)"); Utils.error(LOGGER, GuiKeyframeRepository.this, report, () -> {}); } } diff --git a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java index 95639a3b..75036d17 100644 --- a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java +++ b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java @@ -14,8 +14,8 @@ import com.replaymod.replaystudio.pathing.path.Path; import com.replaymod.replaystudio.pathing.path.Timeline; import com.replaymod.gui.utils.EventRegistrations; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Timer; import javax.annotation.Nullable; import java.util.Iterator; @@ -26,7 +26,7 @@ * Plays a timeline. */ public abstract class AbstractTimelinePlayer extends EventRegistrations { - private final MinecraftClient mc = getMinecraft(); + private final Minecraft mc = getMinecraft(); private final ReplayHandler replayHandler; private Timeline timeline; protected long startOffset; @@ -83,7 +83,7 @@ public int compare(@Nullable Keyframe left, @Nullable Keyframe right) { TimerAccessor timerA = (TimerAccessor) timer; //#if MC>=11200 timerA.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK); - timer.tickDelta = timer.ticksThisFrame = 0; + timer.renderPartialTicks = timer.ticksThisFrame = 0; //#else //$$ timer.timerSpeed = 1; //$$ timer.elapsedPartialTicks = timer.elapsedTicks = 0; @@ -130,12 +130,12 @@ public void onTick() { float timeInTicks = replayTime / 50f; float previousTimeInTicks = lastTime / 50f; float passedTicks = timeInTicks - previousTimeInTicks; - RenderTickCounter renderTickCounter = ((MinecraftAccessor) mc).getTimer(); + Timer renderTickCounter = ((MinecraftAccessor) mc).getTimer(); if (renderTickCounter instanceof ReplayTimer) { ReplayTimer timer = (ReplayTimer) renderTickCounter; - timer.tickDelta += passedTicks; - timer.ticksThisFrame = (int) timer.tickDelta; - timer.tickDelta -= timer.ticksThisFrame; + timer.renderPartialTicks += passedTicks; + timer.ticksThisFrame = (int) timer.renderPartialTicks; + timer.renderPartialTicks -= timer.ticksThisFrame; } lastTime = replayTime; diff --git a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java index 8e910a64..bfb0a595 100644 --- a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java +++ b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java @@ -2,14 +2,14 @@ import com.replaymod.core.utils.WrappedTimer; import com.replaymod.gui.utils.Event; -import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.util.Timer; /** * Wrapper around the current timer that prevents the timer from advancing by itself. */ public class ReplayTimer extends WrappedTimer { //#if MC>=11400 - private final RenderTickCounter state = new RenderTickCounter(0, 0); + private final Timer state = new Timer(0, 0); //#else //$$ private final Timer state = new Timer(0); //#endif @@ -18,7 +18,7 @@ public class ReplayTimer extends WrappedTimer { public int ticksThisFrame; //#endif - public ReplayTimer(RenderTickCounter wrapped) { + public ReplayTimer(Timer wrapped) { super(wrapped); } @@ -31,7 +31,7 @@ public ReplayTimer(RenderTickCounter wrapped) { //#else //$$ void //#endif - beginRenderTick( + getPartialTicks( //#else //$$ public void updateTimer( //#endif @@ -44,7 +44,7 @@ public ReplayTimer(RenderTickCounter wrapped) { //#if MC>=11600 ticksThisFrame = //#endif - wrapped.beginRenderTick( + wrapped.getPartialTicks( //#if MC>=11400 sysClock //#endif @@ -58,7 +58,7 @@ public ReplayTimer(RenderTickCounter wrapped) { //#endif } - public RenderTickCounter getWrapped() { + public Timer getWrapped() { return wrapped; } diff --git a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java index a273d8da..7af16f11 100644 --- a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java +++ b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java @@ -37,7 +37,7 @@ public void applyToGame(Integer value, Object replayHandler) { if (cameraEntity == null) return; World world = cameraEntity.getEntityWorld(); // Lookup entity by id, returns null if an entity with the id does not exists - Entity target = world.getEntityById(value); + Entity target = world.getEntityByID(value); // Spectate entity, when called with null, returns to camera //#if MC>=10800 handler.spectateEntity(target); diff --git a/src/main/java/com/replaymod/recording/ReplayModRecording.java b/src/main/java/com/replaymod/recording/ReplayModRecording.java index 163bf24e..a6edf532 100644 --- a/src/main/java/com/replaymod/recording/ReplayModRecording.java +++ b/src/main/java/com/replaymod/recording/ReplayModRecording.java @@ -11,14 +11,14 @@ import com.replaymod.recording.packet.PacketListener; import io.netty.channel.Channel; import io.netty.util.AttributeKey; -import net.minecraft.network.ClientConnection; +import net.minecraft.network.NetworkManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; //#if FABRIC>=1 -import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; +//$$ import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; //#else -//$$ import net.minecraftforge.fml.network.NetworkRegistry; +import net.minecraftforge.fml.network.NetworkRegistry; //#endif //#if MC>=11400 @@ -68,10 +68,10 @@ public void initClient() { new GuiHandler(core).register(); //#if FABRIC>=1 - ClientSidePacketRegistry.INSTANCE.register(Restrictions.PLUGIN_CHANNEL, (packetContext, packetByteBuf) -> {}); + //$$ ClientSidePacketRegistry.INSTANCE.register(Restrictions.PLUGIN_CHANNEL, (packetContext, packetByteBuf) -> {}); //#else //#if MC>=11400 - //$$ NetworkRegistry.newEventChannel(Restrictions.PLUGIN_CHANNEL, () -> "0", any -> true, any -> true); + NetworkRegistry.newEventChannel(Restrictions.PLUGIN_CHANNEL, () -> "0", any -> true, any -> true); //#else //$$ NetworkRegistry.INSTANCE.newChannel(Restrictions.PLUGIN_CHANNEL, new RestrictionsChannelHandler()); //#endif @@ -83,7 +83,7 @@ public void initClient() { //$$ private static class RestrictionsChannelHandler extends ChannelDuplexHandler {} //#endif - public void initiateRecording(ClientConnection networkManager) { + public void initiateRecording(NetworkManager networkManager) { Channel channel = ((NetworkManagerAccessor) networkManager).getChannel(); if (channel.pipeline().get("ReplayModReplay_replaySender") != null) return; //#if MC>=11400 diff --git a/src/main/java/com/replaymod/recording/ServerInfoExt.java b/src/main/java/com/replaymod/recording/ServerInfoExt.java index a0f26756..986bb04b 100644 --- a/src/main/java/com/replaymod/recording/ServerInfoExt.java +++ b/src/main/java/com/replaymod/recording/ServerInfoExt.java @@ -1,11 +1,11 @@ package com.replaymod.recording; -import net.minecraft.client.network.ServerInfo; +import net.minecraft.client.multiplayer.ServerData; -/** Extension interface for {@link net.minecraft.client.network.ServerInfo}. */ +/** Extension interface for {@link net.minecraft.client.multiplayer.ServerData}. */ public interface ServerInfoExt { - static ServerInfoExt from(ServerInfo base) { + static ServerInfoExt from(ServerData base) { return (ServerInfoExt) base; } diff --git a/src/main/java/com/replaymod/recording/gui/GuiRecordingControls.java b/src/main/java/com/replaymod/recording/gui/GuiRecordingControls.java index c155ffc2..05731fe3 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiRecordingControls.java +++ b/src/main/java/com/replaymod/recording/gui/GuiRecordingControls.java @@ -13,11 +13,11 @@ import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.InitScreenCallback; -import net.minecraft.client.gui.screen.GameMenuScreen; +import net.minecraft.client.gui.screen.IngameMenuScreen; import net.minecraft.client.gui.screen.Screen; //#if MC>=11400 -import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.client.gui.widget.Widget; //#endif import java.util.List; @@ -79,12 +79,12 @@ private void updateState() { { on(InitScreenCallback.EVENT, this::injectIntoIngameMenu); } private void injectIntoIngameMenu(Screen guiScreen, //#if MC>=11400 - List buttonList + List buttonList //#else //$$ List buttonList //#endif ) { - if (!(guiScreen instanceof GameMenuScreen)) { + if (!(guiScreen instanceof IngameMenuScreen)) { return; } Function yPos = diff --git a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java index d39495eb..5ccbeec3 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java +++ b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java @@ -6,10 +6,10 @@ import com.replaymod.gui.MinecraftGuiRenderer; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.RenderHudCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.resources.I18n; +import com.mojang.blaze3d.matrix.MatrixStack; import static com.replaymod.core.ReplayMod.TEXTURE; import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; @@ -19,11 +19,11 @@ * Renders overlay during recording. */ public class GuiRecordingOverlay extends EventRegistrations { - private final MinecraftClient mc; + private final Minecraft mc; private final SettingsRegistry settingsRegistry; private final GuiRecordingControls guiControls; - public GuiRecordingOverlay(MinecraftClient mc, SettingsRegistry settingsRegistry, GuiRecordingControls guiControls) { + public GuiRecordingOverlay(Minecraft mc, SettingsRegistry settingsRegistry, GuiRecordingControls guiControls) { this.mc = mc; this.settingsRegistry = settingsRegistry; this.guiControls = guiControls; @@ -36,13 +36,13 @@ public GuiRecordingOverlay(MinecraftClient mc, SettingsRegistry settingsRegistry private void renderRecordingIndicator(MatrixStack stack) { if (guiControls.isStopped()) return; if (settingsRegistry.get(Setting.INDICATOR)) { - TextRenderer fontRenderer = mc.textRenderer; - String text = guiControls.isPaused() ? I18n.translate("replaymod.gui.paused") : I18n.translate("replaymod.gui.recording"); - fontRenderer.draw( + FontRenderer fontRenderer = mc.fontRenderer; + String text = guiControls.isPaused() ? I18n.format("replaymod.gui.paused") : I18n.format("replaymod.gui.recording"); + fontRenderer.drawString( //#if MC>=11600 stack, //#endif - text.toUpperCase(), 30, 18 - (fontRenderer.fontHeight / 2), 0xffffffff); + text.toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff); mc.getTextureManager().bindTexture(TEXTURE); enableAlphaTest(); GuiRenderer renderer = new MinecraftGuiRenderer(stack); diff --git a/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java b/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java index 83d41907..047818f5 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java +++ b/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java @@ -23,8 +23,8 @@ import com.replaymod.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.MinecraftClient; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.client.Minecraft; +import net.minecraft.crash.CrashReport; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -39,7 +39,7 @@ public class GuiSavingReplay { - private static final MinecraftClient mc = getMinecraft(); + private static final Minecraft mc = getMinecraft(); private static final Logger logger = LogManager.getLogger(); private final GuiLabel label = new GuiLabel() @@ -147,7 +147,7 @@ private void applyOutput(Path path, String newName) { Files.delete(path); } catch (IOException e) { logger.error("Deleting replay file:", e); - CrashReport crashReport = CrashReport.create(e, "Deleting replay file"); + CrashReport crashReport = CrashReport.makeCrashReport(e, "Deleting replay file"); core.runLater(() -> Utils.error(logger, VanillaGuiScreen.wrap(mc.currentScreen), crashReport, () -> {})); } return; @@ -162,7 +162,7 @@ private void applyOutput(Path path, String newName) { Files.move(path, newPath); } catch (IOException e) { logger.error("Renaming replay file:", e); - CrashReport crashReport = CrashReport.create(e, "Renaming replay file"); + CrashReport crashReport = CrashReport.makeCrashReport(e, "Renaming replay file"); core.runLater(() -> Utils.error(logger, VanillaGuiScreen.wrap(mc.currentScreen), crashReport, () -> {})); } } diff --git a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java index 5ff366ca..0473c52e 100644 --- a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java @@ -14,10 +14,10 @@ import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayMetaData; import io.netty.channel.Channel; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ServerInfo; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.network.ClientConnection; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.resources.I18n; +import net.minecraft.network.NetworkManager; import org.apache.logging.log4j.Logger; //#if MC>=11600 @@ -46,7 +46,7 @@ public class ConnectionEventHandler { private static final String packetHandlerKey = "packet_handler"; private static final String DATE_FORMAT = "yyyy_MM_dd_HH_mm_ss"; private static final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); - private static final MinecraftClient mc = getMinecraft(); + private static final Minecraft mc = getMinecraft(); private final Logger logger; private final ReplayMod core; @@ -61,13 +61,13 @@ public ConnectionEventHandler(Logger logger, ReplayMod core) { this.core = core; } - public void onConnectedToServerEvent(ClientConnection networkManager) { + public void onConnectedToServerEvent(NetworkManager networkManager) { try { - boolean local = networkManager.isLocal(); + boolean local = networkManager.isLocalChannel(); if (local) { //#if MC>=10800 //#if MC>=11600 - if (mc.getServer().getWorld(World.OVERWORLD).isDebugWorld()) { + if (mc.getIntegratedServer().getWorld(World.OVERWORLD).isDebug()) { //#else //#if MC>=11400 //$$ if (mc.getServer().getWorld(DimensionType.OVERWORLD).getGeneratorType() == LevelGeneratorType.DEBUG_ALL_BLOCK_STATES) { @@ -95,16 +95,16 @@ public void onConnectedToServerEvent(ClientConnection networkManager) { boolean autoStart = core.getSettingsRegistry().get(Setting.AUTO_START_RECORDING); if (local) { //#if MC>=11600 - worldName = mc.getServer().getSaveProperties().getLevelName(); + worldName = mc.getIntegratedServer().getServerConfiguration().getWorldName(); //#else //$$ worldName = mc.getServer().getLevelName(); //#endif serverName = worldName; - } else if (mc.getCurrentServerEntry() != null) { - ServerInfo serverInfo = mc.getCurrentServerEntry(); - worldName = serverInfo.address; - if (!I18n.translate("selectServer.defaultName").equals(serverInfo.name)) { - serverName = serverInfo.name; + } else if (mc.getCurrentServerData() != null) { + ServerData serverInfo = mc.getCurrentServerData(); + worldName = serverInfo.serverIP; + if (!I18n.format("selectServer.defaultName").equals(serverInfo.serverName)) { + serverName = serverInfo.serverName; } Boolean autoStartServer = ServerInfoExt.from(serverInfo).getAutoRecording(); diff --git a/src/main/java/com/replaymod/recording/handler/GuiHandler.java b/src/main/java/com/replaymod/recording/handler/GuiHandler.java index 3d0e95f6..dcc2a802 100644 --- a/src/main/java/com/replaymod/recording/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/recording/handler/GuiHandler.java @@ -16,10 +16,10 @@ import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.InitScreenCallback; import net.minecraft.client.gui.screen.AddServerScreen; -import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; -import net.minecraft.client.gui.screen.world.SelectWorldScreen; -import net.minecraft.client.network.ServerInfo; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.gui.screen.MultiplayerScreen; +import net.minecraft.client.gui.screen.WorldSelectionScreen; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.resources.I18n; public class GuiHandler extends EventRegistrations { @@ -31,8 +31,8 @@ public GuiHandler(ReplayMod mod) { { on(InitScreenCallback.EVENT, (screen, buttons) -> onGuiInit(screen)); } private void onGuiInit(net.minecraft.client.gui.screen.Screen gui) { - if (gui instanceof SelectWorldScreen || gui instanceof MultiplayerScreen) { - boolean sp = gui instanceof SelectWorldScreen; + if (gui instanceof WorldSelectionScreen || gui instanceof MultiplayerScreen) { + boolean sp = gui instanceof WorldSelectionScreen; SettingsRegistry settingsRegistry = mod.getSettingsRegistry(); Setting setting = sp ? Setting.RECORD_SINGLEPLAYER : Setting.RECORD_SERVER; @@ -57,15 +57,15 @@ protected void layout(GuiScreen container, int width, int height) { if (gui instanceof AddServerScreen) { VanillaGuiScreen vanillaGui = VanillaGuiScreen.wrap(gui); GuiButton replayButton = new GuiReplayButton().onClick(() -> { - ServerInfo serverInfo = ((AddServerScreenAccessor) gui).getServer(); + ServerData serverInfo = ((AddServerScreenAccessor) gui).getServer(); ServerInfoExt serverInfoExt = ServerInfoExt.from(serverInfo); Boolean state = serverInfoExt.getAutoRecording(); GuiToggleButton autoRecording = new GuiToggleButton() .setI18nLabel("replaymod.gui.settings.autostartrecording") .setValues( - I18n.translate("replaymod.gui.settings.default"), - I18n.translate("options.off"), - I18n.translate("options.on") + I18n.format("replaymod.gui.settings.default"), + I18n.format("options.off"), + I18n.format("options.on") ) .setSelected(state == null ? 0 : state ? 2 : 1); autoRecording.onClick(() -> { diff --git a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java index c11e2a23..d7cfdec3 100644 --- a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java @@ -5,29 +5,29 @@ import com.replaymod.recording.packet.PacketListener; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.PreTickCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.Entity; -import net.minecraft.network.packet.s2c.play.BlockBreakingProgressS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityAttachS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityPositionS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityS2CPacket; -import net.minecraft.network.packet.s2c.play.EntitySetHeadYawS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerSpawnS2CPacket; +import net.minecraft.network.play.server.SAnimateBlockBreakPacket; +import net.minecraft.network.play.server.SAnimateHandPacket; +import net.minecraft.network.play.server.SMountEntityPacket; +import net.minecraft.network.play.server.SEntityEquipmentPacket; +import net.minecraft.network.play.server.SEntityTeleportPacket; +import net.minecraft.network.play.server.SEntityPacket; +import net.minecraft.network.play.server.SEntityHeadLookPacket; +import net.minecraft.network.play.server.SEntityVelocityPacket; +import net.minecraft.network.play.server.SSpawnPlayerPacket; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.network.Packet; +import net.minecraft.network.IPacket; import net.minecraft.server.integrated.IntegratedServer; // FIXME not (yet?) 1.13 import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; //#if FABRIC<1 -//$$ import net.minecraft.network.play.server.SCollectItemPacket; -//$$ import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; -//$$ import net.minecraftforge.eventbus.api.SubscribeEvent; -//$$ import net.minecraftforge.event.entity.player.PlayerEvent.ItemPickupEvent; +import net.minecraft.network.play.server.SCollectItemPacket; +import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.player.PlayerEvent.ItemPickupEvent; //#endif //#if MC>=11600 @@ -42,14 +42,14 @@ //#if MC>=10904 import com.replaymod.mixin.EntityLivingBaseAccessor; -import net.minecraft.network.packet.s2c.play.EntityTrackerUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; -import net.minecraft.network.packet.s2c.play.WorldEventS2CPacket; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.data.DataTracker; +import net.minecraft.network.play.server.SEntityMetadataPacket; +import net.minecraft.network.play.server.SPlaySoundEffectPacket; +import net.minecraft.network.play.server.SPlaySoundEventPacket; +import net.minecraft.inventory.EquipmentSlotType; +import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.util.Hand; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; //#endif //#if MC>=10800 @@ -64,7 +64,7 @@ public class RecordingEventHandler extends EventRegistrations { - private final MinecraftClient mc = getMinecraft(); + private final Minecraft mc = getMinecraft(); private final PacketListener packetListener; private Double lastX, lastY, lastZ; @@ -98,7 +98,7 @@ public void unregister() { } //#if MC>=11400 - public void onPacket(Packet packet) { + public void onPacket(IPacket packet) { packetListener.save(packet); } //#endif @@ -107,9 +107,9 @@ public void spawnRecordingPlayer() { try { ClientPlayerEntity player = mc.player; assert player != null; - packetListener.save(new PlayerSpawnS2CPacket(player)); + packetListener.save(new SSpawnPlayerPacket(player)); //#if MC>=11500 - packetListener.save(new EntityTrackerUpdateS2CPacket(player.getEntityId(), player.getDataTracker(), true)); + packetListener.save(new SEntityMetadataPacket(player.getEntityId(), player.getDataManager(), true)); //#endif lastX = lastY = lastZ = null; } catch(Exception e) { @@ -122,7 +122,7 @@ public void onClientSound(SoundEvent sound, SoundCategory category, double x, double y, double z, float volume, float pitch) { try { // Send to all other players in ServerWorldEventHandler#playSoundToAllNearExcept - packetListener.save(new PlaySoundS2CPacket(sound, category, x, y, z, volume, pitch)); + packetListener.save(new SPlaySoundEffectPacket(sound, category, x, y, z, volume, pitch)); } catch(Exception e) { e.printStackTrace(); } @@ -131,7 +131,7 @@ public void onClientSound(SoundEvent sound, SoundCategory category, public void onClientEffect(int type, BlockPos pos, int data) { try { // Send to all other players in ServerWorldEventHandler#playEvent - packetListener.save(new WorldEventS2CPacket(type, pos, data, false)); + packetListener.save(new SPlaySoundEventPacket(type, pos, data, false)); } catch(Exception e) { e.printStackTrace(); } @@ -147,9 +147,9 @@ private void onPlayerTick() { boolean force = false; if(lastX == null || lastY == null || lastZ == null) { force = true; - lastX = player.getX(); - lastY = player.getY(); - lastZ = player.getZ(); + lastX = player.getPosX(); + lastY = player.getPosY(); + lastZ = player.getPosZ(); } ticksSinceLastCorrection++; @@ -158,18 +158,18 @@ private void onPlayerTick() { force = true; } - double dx = player.getX() - lastX; - double dy = player.getY() - lastY; - double dz = player.getZ() - lastZ; + double dx = player.getPosX() - lastX; + double dy = player.getPosY() - lastY; + double dz = player.getPosZ() - lastZ; - lastX = player.getX(); - lastY = player.getY(); - lastZ = player.getZ(); + lastX = player.getPosX(); + lastY = player.getPosY(); + lastZ = player.getPosZ(); - Packet packet; + IPacket packet; if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) { //#if MC>=10800 - packet = new EntityPositionS2CPacket(player); + packet = new SEntityTeleportPacket(player); //#else //$$ // In 1.7.10 the client player entity has its posY at eye height //$$ // but for all other entities it's at their feet (as it should be). @@ -187,11 +187,11 @@ private void onPlayerTick() { //$$ ); //#endif } else { - byte newYaw = (byte) ((int) (player.yaw * 256.0F / 360.0F)); - byte newPitch = (byte) ((int) (player.pitch * 256.0F / 360.0F)); + byte newYaw = (byte) ((int) (player.rotationYaw * 256.0F / 360.0F)); + byte newPitch = (byte) ((int) (player.rotationPitch * 256.0F / 360.0F)); //#if MC>=11400 - packet = new EntityS2CPacket.RotateAndMoveRelative( + packet = new SEntityPacket.MovePacket( //#else //$$ packet = new SPacketEntity.S17PacketEntityLookMove( //#endif @@ -215,16 +215,16 @@ private void onPlayerTick() { packetListener.save(packet); //HEAD POS - int rotationYawHead = ((int)(player.headYaw * 256.0F / 360.0F)); + int rotationYawHead = ((int)(player.rotationYawHead * 256.0F / 360.0F)); if(!Objects.equals(rotationYawHead, rotationYawHeadBefore)) { - packetListener.save(new EntitySetHeadYawS2CPacket(player, (byte) rotationYawHead)); + packetListener.save(new SEntityHeadLookPacket(player, (byte) rotationYawHead)); rotationYawHeadBefore = rotationYawHead; } - packetListener.save(new EntityVelocityUpdateS2CPacket(player.getEntityId(), + packetListener.save(new SEntityVelocityPacket(player.getEntityId(), //#if MC>=11400 - player.getVelocity() + player.getMotion() //#else //$$ player.motionX, player.motionY, player.motionZ //#endif @@ -232,11 +232,11 @@ private void onPlayerTick() { //Animation Packets //Swing Animation - if (player.handSwinging && player.handSwingTicks == 0) { - packetListener.save(new EntityAnimationS2CPacket( + if (player.isSwingInProgress && player.swingProgressInt == 0) { + packetListener.save(new SAnimateHandPacket( player, //#if MC>=10904 - player.preferredHand == Hand.MAIN_HAND ? 0 : 3 + player.swingingHand == Hand.MAIN_HAND ? 0 : 3 //#else //$$ 0 //#endif @@ -265,12 +265,12 @@ private void onPlayerTick() { //Inventory Handling //#if MC>=10904 - for (EquipmentSlot slot : EquipmentSlot.values()) { - ItemStack stack = player.getEquippedStack(slot); + for (EquipmentSlotType slot : EquipmentSlotType.values()) { + ItemStack stack = player.getItemStackFromSlot(slot); if (playerItems[slot.ordinal()] != stack) { playerItems[slot.ordinal()] = stack; //#if MC>=11600 - packetListener.save(new EntityEquipmentUpdateS2CPacket(player.getEntityId(), Collections.singletonList(Pair.of(slot, stack)))); + packetListener.save(new SEntityEquipmentPacket(player.getEntityId(), Collections.singletonList(Pair.of(slot, stack)))); //#else //$$ packetListener.save(new EntityEquipmentUpdateS2CPacket(player.getEntityId(), slot, stack)); //#endif @@ -310,11 +310,11 @@ private void onPlayerTick() { //Leaving Ride - Entity vehicle = player.getVehicle(); + Entity vehicle = player.getRidingEntity(); int vehicleId = vehicle == null ? -1 : vehicle.getEntityId(); if (lastRiding != vehicleId) { lastRiding = vehicleId; - packetListener.save(new EntityAttachS2CPacket( + packetListener.save(new SMountEntityPacket( //#if MC<10904 //$$ 0, //#endif @@ -325,19 +325,19 @@ private void onPlayerTick() { //Sleeping if(!player.isSleeping() && wasSleeping) { - packetListener.save(new EntityAnimationS2CPacket(player, 2)); + packetListener.save(new SAnimateHandPacket(player, 2)); wasSleeping = false; } //#if MC>=10904 // Active hand (e.g. eating, drinking, blocking) - if (player.isUsingItem() ^ wasHandActive || player.getActiveHand() != lastActiveHand) { - wasHandActive = player.isUsingItem(); + if (player.isHandActive() ^ wasHandActive || player.getActiveHand() != lastActiveHand) { + wasHandActive = player.isHandActive(); lastActiveHand = player.getActiveHand(); - DataTracker dataManager = new DataTracker(null); + EntityDataManager dataManager = new EntityDataManager(null); int state = (wasHandActive ? 1 : 0) | (lastActiveHand == Hand.OFF_HAND ? 2 : 0); - dataManager.startTracking(EntityLivingBaseAccessor.getLivingFlags(), (byte) state); - packetListener.save(new EntityTrackerUpdateS2CPacket(player.getEntityId(), dataManager, true)); + dataManager.register(EntityLivingBaseAccessor.getLivingFlags(), (byte) state); + packetListener.save(new SEntityMetadataPacket(player.getEntityId(), dataManager, true)); } //#endif @@ -347,20 +347,20 @@ private void onPlayerTick() { } //#if FABRIC>=1 - // FIXME fabric + //$$ // FIXME fabric //#else - //$$ @SubscribeEvent - //$$ public void onPickupItem(ItemPickupEvent event) { - //$$ try { + @SubscribeEvent + public void onPickupItem(ItemPickupEvent event) { + try { //#if MC>=11100 //#if MC>=11200 //#if MC>=11400 - //$$ ItemStack stack = event.getStack(); - //$$ packetListener.save(new SCollectItemPacket( - //$$ event.getOriginalEntity().getEntityId(), - //$$ event.getPlayer().getEntityId(), - //$$ event.getStack().getCount() - //$$ )); + ItemStack stack = event.getStack(); + packetListener.save(new SCollectItemPacket( + event.getOriginalEntity().getEntityId(), + event.getPlayer().getEntityId(), + event.getStack().getCount() + )); //#else //$$ packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId(), //$$ event.pickedUp.getItem().getMaxStackSize())); @@ -372,10 +372,10 @@ private void onPlayerTick() { //#else //$$ packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId())); //#endif - //$$ } catch(Exception e) { - //$$ e.printStackTrace(); - //$$ } - //$$ } + } catch(Exception e) { + e.printStackTrace(); + } + } //#endif //#if MC>=11400 @@ -446,7 +446,7 @@ public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) { //#endif PlayerEntity thePlayer = mc.player; if (thePlayer != null && breakerId == thePlayer.getEntityId()) { - packetListener.save(new BlockBreakingProgressS2CPacket(breakerId, + packetListener.save(new SAnimateBlockBreakPacket(breakerId, //#if MC>=10800 pos, //#else @@ -458,8 +458,8 @@ public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) { { on(PreRenderCallback.EVENT, this::checkForGamePaused); } private void checkForGamePaused() { - if (mc.isIntegratedServerRunning()) { - IntegratedServer server = mc.getServer(); + if (mc.isSingleplayer()) { + IntegratedServer server = mc.getIntegratedServer(); if (server != null && ((IntegratedServerAccessor) server).isGamePaused()) { packetListener.setServerWasPaused(); } diff --git a/src/main/java/com/replaymod/recording/packet/PacketListener.java b/src/main/java/com/replaymod/recording/packet/PacketListener.java index 9a2c5d95..0ec1ffb7 100644 --- a/src/main/java/com/replaymod/recording/packet/PacketListener.java +++ b/src/main/java/com/replaymod/recording/packet/PacketListener.java @@ -23,30 +23,30 @@ import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import net.minecraft.client.MinecraftClient; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; -import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; -import net.minecraft.network.packet.s2c.play.ItemPickupAnimationS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerSpawnS2CPacket; +import net.minecraft.client.Minecraft; +import net.minecraft.network.play.server.SCustomPayloadPlayPacket; +import net.minecraft.network.play.server.SDisconnectPacket; +import net.minecraft.network.play.server.SCollectItemPacket; +import net.minecraft.network.play.server.SSpawnPlayerPacket; import net.minecraft.entity.Entity; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.network.NetworkState; -import net.minecraft.network.Packet; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.text.LiteralText; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.network.ProtocolType; +import net.minecraft.network.IPacket; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.crash.CrashReport; import org.apache.commons.io.FilenameUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; //#if MC>=11400 -import net.minecraft.network.packet.s2c.login.LoginSuccessS2CPacket; +import net.minecraft.network.login.server.SLoginSuccessPacket; //#else //$$ import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; //#endif //#if FABRIC<1 -//$$ import net.minecraft.network.login.server.SCustomPayloadLoginPacket; +import net.minecraft.network.login.server.SCustomPayloadLoginPacket; //#endif //#if MC>=10904 @@ -58,9 +58,9 @@ //#if MC<10904 //$$ import net.minecraft.network.play.server.S46PacketSetCompressionLevel; //#endif -import net.minecraft.network.packet.s2c.login.LoginCompressionS2CPacket; -import net.minecraft.network.packet.s2c.play.ResourcePackSendS2CPacket; -import net.minecraft.network.NetworkSide; +import net.minecraft.network.login.server.SEnableCompressionPacket; +import net.minecraft.network.play.server.SSendResourcePackPacket; +import net.minecraft.network.PacketDirection; //#endif import java.io.IOException; @@ -83,7 +83,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter { - private static final MinecraftClient mc = getMinecraft(); + private static final Minecraft mc = getMinecraft(); private static final Logger logger = LogManager.getLogger(); private final ReplayMod core; @@ -103,7 +103,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter { private long lastSentPacket; private long timePassedWhilePaused; private volatile boolean serverWasPaused; - private NetworkState connectionState = NetworkState.LOGIN; + private ProtocolType connectionState = ProtocolType.LOGIN; private boolean loginPhase = true; /** @@ -152,19 +152,19 @@ private void saveMetaData() { }); } - public void save(Packet packet) { + public void save(IPacket packet) { // If we're not on the main thread (i.e. we're on the netty thread), then we need to schedule the saving // to happen on the main thread so we can guarantee correct ordering of inbound and inject packets. // Otherwise, injected packets may end up further down the packet stream than they were supposed to and other // inbound packets which may rely on the injected packet would behave incorrectly when played back. - if (!mc.isOnThread()) { - mc.send(() -> save(packet)); + if (!mc.isOnExecutionThread()) { + mc.enqueue(() -> save(packet)); return; } try { - if(packet instanceof PlayerSpawnS2CPacket) { + if(packet instanceof SSpawnPlayerPacket) { //#if MC>=10800 - UUID uuid = ((PlayerSpawnS2CPacket) packet).getPlayerUuid(); + UUID uuid = ((SSpawnPlayerPacket) packet).getUniqueId(); //#else //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_148948_e().getId(); //#endif @@ -175,7 +175,7 @@ public void save(Packet packet) { } //#if MC>=10800 - if (packet instanceof LoginCompressionS2CPacket) { + if (packet instanceof SEnableCompressionPacket) { return; // Replay data is never compressed on the packet level } //#if MC<10904 @@ -221,7 +221,7 @@ public void save(Packet packet) { }); //#if MC>=11400 - if (packet instanceof LoginSuccessS2CPacket) { + if (packet instanceof SLoginSuccessPacket) { moveToPlayState(); } //#endif @@ -292,7 +292,7 @@ public void channelInactive(ChannelHandlerContext ctx) { } } catch (Exception e) { logger.error("Saving replay file:", e); - CrashReport crashReport = CrashReport.create(e, "Saving replay file"); + CrashReport crashReport = CrashReport.makeCrashReport(e, "Saving replay file"); core.runLater(() -> Utils.error(logger, VanillaGuiScreen.wrap(mc.currentScreen), crashReport, guiSavingReplay::close)); return; } @@ -313,14 +313,14 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception } this.context = ctx; - if (msg instanceof Packet) { + if (msg instanceof IPacket) { try { - Packet packet = (Packet) msg; + IPacket packet = (IPacket) msg; //#if MC>=10904 - if(packet instanceof ItemPickupAnimationS2CPacket) { + if(packet instanceof SCollectItemPacket) { if(mc.player != null || - ((ItemPickupAnimationS2CPacket) packet).getEntityId() == mc.player.getEntityId()) { + ((SCollectItemPacket) packet).getCollectedItemEntityID() == mc.player.getEntityId()) { //#else //$$ if(packet instanceof S0DPacketCollectItem) { //$$ if(mc.thePlayer != null || ((S0DPacketCollectItem) packet).getEntityID() == mc.thePlayer.getEntityId()) { @@ -331,8 +331,8 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception } //#if MC>=10800 - if (packet instanceof ResourcePackSendS2CPacket) { - save(resourcePackRecorder.handleResourcePack((ResourcePackSendS2CPacket) packet)); + if (packet instanceof SSendResourcePackPacket) { + save(resourcePackRecorder.handleResourcePack((SSendResourcePackPacket) packet)); return; } //#else @@ -359,35 +359,35 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception //#endif //#if FABRIC<1 - //$$ if (packet instanceof SCustomPayloadLoginPacket) { - //$$ PacketBuffer buffer = new PacketBuffer(Unpooled.buffer()); - //$$ packet.writePacketData(buffer); - //$$ packet = new SCustomPayloadLoginPacket(); - //$$ packet.readPacketData(buffer); - //$$ } + if (packet instanceof SCustomPayloadLoginPacket) { + PacketBuffer buffer = new PacketBuffer(Unpooled.buffer()); + packet.writePacketData(buffer); + packet = new SCustomPayloadLoginPacket(); + packet.readPacketData(buffer); + } //#endif //#if MC>=10800 - if (packet instanceof CustomPayloadS2CPacket) { + if (packet instanceof SCustomPayloadPlayPacket) { // Forge may read from this ByteBuf and/or release it during handling // We want to save the full thing however, so we create a copy and save that one instead of the // original one // Note: This isn't an issue with vanilla MC because our saving code runs on the main thread // shortly before the vanilla handling code does. Forge however does some stuff on the netty // threads which leads to this race condition - packet = new CustomPayloadS2CPacket( - ((CustomPayloadS2CPacket) packet).getChannel(), - new PacketByteBuf(((CustomPayloadS2CPacket) packet).getData().slice().retain()) + packet = new SCustomPayloadPlayPacket( + ((SCustomPayloadPlayPacket) packet).getChannelName(), + new PacketBuffer(((SCustomPayloadPlayPacket) packet).getBufferData().slice().retain()) ); } //#endif save(packet); - if (packet instanceof CustomPayloadS2CPacket) { - CustomPayloadS2CPacket p = (CustomPayloadS2CPacket) packet; - if (Restrictions.PLUGIN_CHANNEL.equals(p.getChannel())) { - packet = new DisconnectS2CPacket(new LiteralText("Please update to view this replay.")); + if (packet instanceof SCustomPayloadPlayPacket) { + SCustomPayloadPlayPacket p = (SCustomPayloadPlayPacket) packet; + if (Restrictions.PLUGIN_CHANNEL.equals(p.getChannelName())) { + packet = new SDisconnectPacket(new StringTextComponent("Please update to view this replay.")); save(packet); } } @@ -401,13 +401,13 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception } //#if MC>=10904 - private void DataManager_set(DataTracker dataManager, DataTracker.Entry entry) { - dataManager.startTracking(entry.getData(), entry.get()); + private void DataManager_set(EntityDataManager dataManager, EntityDataManager.DataEntry entry) { + dataManager.register(entry.getKey(), entry.getValue()); } //#endif @SuppressWarnings("unchecked") - private PacketData getPacketData(int timestamp, Packet packet) throws Exception { + private PacketData getPacketData(int timestamp, IPacket packet) throws Exception { //#if MC<11500 //$$ if (packet instanceof MobSpawnS2CPacket) { //$$ MobSpawnS2CPacket p = (MobSpawnS2CPacket) packet; @@ -457,7 +457,7 @@ private PacketData getPacketData(int timestamp, Packet packet) throws Exception Integer packetId = getPacketId(packet); ByteBuf byteBuf = Unpooled.buffer(); try { - packet.write(new PacketByteBuf(byteBuf)); + packet.writePacketData(new PacketBuffer(byteBuf)); return new PacketData(timestamp, new com.replaymod.replaystudio.protocol.Packet( MCVer.getPacketTypeRegistry(loginPhase), packetId, @@ -471,8 +471,8 @@ private PacketData getPacketData(int timestamp, Packet packet) throws Exception byteBuf.release(); //#if MC>=10800 - if (packet instanceof CustomPayloadS2CPacket) { - ((CustomPayloadS2CPacket) packet).getData().release(); + if (packet instanceof SCustomPayloadPlayPacket) { + ((SCustomPayloadPlayPacket) packet).getBufferData().release(); } //#endif } @@ -483,17 +483,17 @@ public void addMarker(String name) { } public void addMarker(String name, int timestamp) { - Entity view = mc.getCameraEntity(); + Entity view = mc.getRenderViewEntity(); Marker marker = new Marker(); marker.setName(name); marker.setTime(timestamp); if (view != null) { - marker.setX(view.getX()); - marker.setY(view.getY()); - marker.setZ(view.getZ()); - marker.setYaw(view.yaw); - marker.setPitch(view.pitch); + marker.setX(view.getPosX()); + marker.setY(view.getPosY()); + marker.setZ(view.getPosZ()); + marker.setYaw(view.rotationYaw); + marker.setPitch(view.rotationPitch); } // Roll is always 0 saveService.submit(() -> { @@ -517,9 +517,9 @@ public void setServerWasPaused() { this.serverWasPaused = true; } - private Integer getPacketId(Packet packet) throws IOException { + private Integer getPacketId(IPacket packet) throws IOException { //#if MC>=10800 - Integer packetId = connectionState.getPacketId(NetworkSide.CLIENTBOUND, packet); + Integer packetId = connectionState.getPacketId(PacketDirection.CLIENTBOUND, packet); //#else //$$ Integer packetId = (Integer) connectionState.func_150755_b().inverse().get(packet.getClass()); //#endif @@ -529,7 +529,7 @@ private Integer getPacketId(Packet packet) throws IOException { Retrying as the state is PLAY TODO: Investigate packet order and refactor to be more consistent */ - packetId = NetworkState.PLAY.getPacketId(NetworkSide.CLIENTBOUND, packet); + packetId = ProtocolType.PLAY.getPacketId(PacketDirection.CLIENTBOUND, packet); if (packetId == null) { throw new IOException("Unknown packet type:" + packet.getClass()); @@ -542,7 +542,7 @@ private Integer getPacketId(Packet packet) throws IOException { } private void moveToPlayState() { - connectionState = NetworkState.PLAY; + connectionState = ProtocolType.PLAY; loginPhase = false; } } diff --git a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java index 55229ac6..d8e2fccd 100644 --- a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java +++ b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java @@ -3,16 +3,16 @@ import com.google.common.hash.Hashing; import com.google.common.io.Files; import com.replaymod.replaystudio.replay.ReplayFile; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.ConfirmScreen; -import net.minecraft.client.network.ServerInfo; -import net.minecraft.client.options.ServerList; -import net.minecraft.client.resource.ClientBuiltinResourcePackProvider; +import net.minecraft.client.multiplayer.ServerData; +import net.minecraft.client.multiplayer.ServerList; +import net.minecraft.client.resources.DownloadingPackFinder; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; //#if MC>=11400 -import net.minecraft.text.TranslatableText; +import net.minecraft.util.text.TranslationTextComponent; //#else //$$ import net.minecraft.client.gui.GuiYesNoCallback; //$$ import net.minecraft.client.resources.I18n; @@ -26,9 +26,9 @@ //#endif //#if MC>=10800 -import net.minecraft.network.packet.c2s.play.ResourcePackStatusC2SPacket; -import net.minecraft.network.packet.c2s.play.ResourcePackStatusC2SPacket.Status; -import net.minecraft.network.packet.s2c.play.ResourcePackSendS2CPacket; +import net.minecraft.network.play.client.CResourcePackStatusPacket; +import net.minecraft.network.play.client.CResourcePackStatusPacket.Action; +import net.minecraft.network.play.server.SSendResourcePackPacket; //#endif //#if MC>=10800 @@ -37,8 +37,8 @@ //#else //$$ import com.google.common.util.concurrent.ListenableFuture; //#endif -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.network.ClientConnection; +import net.minecraft.client.network.play.ClientPlayNetHandler; +import net.minecraft.network.NetworkManager; //#else //$$ import com.replaymod.core.mixin.ResourcePackRepositoryAccessor; //$$ import net.minecraft.client.multiplayer.ServerData.ServerResourceMode; @@ -61,7 +61,7 @@ */ public class ResourcePackRecorder { private static final Logger logger = LogManager.getLogger(); - private static final MinecraftClient mc = getMinecraft(); + private static final Minecraft mc = getMinecraft(); private final ReplayFile replayFile; @@ -102,49 +102,49 @@ public void recordResourcePack(File file, int requestId) { } //#if MC>=10800 - public ResourcePackStatusC2SPacket makeStatusPacket(String hash, Status action) { + public CResourcePackStatusPacket makeStatusPacket(String hash, Action action) { //#if MC>=11002 - return new ResourcePackStatusC2SPacket(action); + return new CResourcePackStatusPacket(action); //#else //$$ return new CPacketResourcePackStatus(hash, action); //#endif } - public synchronized ResourcePackSendS2CPacket handleResourcePack(ResourcePackSendS2CPacket packet) { + public synchronized SSendResourcePackPacket handleResourcePack(SSendResourcePackPacket packet) { final int requestId = nextRequestId++; - final ClientPlayNetworkHandler netHandler = mc.getNetworkHandler(); - final ClientConnection netManager = netHandler.getConnection(); + final ClientPlayNetHandler netHandler = mc.getConnection(); + final NetworkManager netManager = netHandler.getNetworkManager(); final String url = packet.getURL(); - final String hash = packet.getSHA1(); + final String hash = packet.getHash(); if (url.startsWith("level://")) { String levelName = url.substring("level://".length()); - File savesDir = new File(mc.runDirectory, "saves"); + File savesDir = new File(mc.gameDir, "saves"); final File levelDir = new File(savesDir, levelName); if (levelDir.isFile()) { - netManager.send(makeStatusPacket(hash, Status.ACCEPTED)); + netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED)); addCallback(setServerResourcePack(levelDir), result -> { recordResourcePack(levelDir, requestId); - netManager.send(makeStatusPacket(hash, Status.SUCCESSFULLY_LOADED)); + netManager.sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED)); }, throwable -> { - netManager.send(makeStatusPacket(hash, Status.FAILED_DOWNLOAD)); + netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD)); }); } else { - netManager.send(makeStatusPacket(hash, Status.FAILED_DOWNLOAD)); + netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD)); } } else { - final ServerInfo serverData = mc.getCurrentServerEntry(); - if (serverData != null && serverData.getResourcePack() == ServerInfo.ResourcePackState.ENABLED) { - netManager.send(makeStatusPacket(hash, Status.ACCEPTED)); + final ServerData serverData = mc.getCurrentServerData(); + if (serverData != null && serverData.getResourceMode() == ServerData.ServerResourceMode.ENABLED) { + netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED)); downloadResourcePackFuture(requestId, url, hash); - } else if (serverData != null && serverData.getResourcePack() != ServerInfo.ResourcePackState.PROMPT) { - netManager.send(makeStatusPacket(hash, Status.DECLINED)); + } else if (serverData != null && serverData.getResourceMode() != ServerData.ServerResourceMode.PROMPT) { + netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED)); } else { // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError) //#if MC>=11400 - mc.execute(() -> mc.openScreen(new ConfirmScreen(result -> { + mc.execute(() -> mc.displayGuiScreen(new ConfirmScreen(result -> { //#else //$$ //noinspection Convert2Lambda //$$ mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() { @@ -152,33 +152,33 @@ public synchronized ResourcePackSendS2CPacket handleResourcePack(ResourcePackSen //$$ public void confirmClicked(boolean result, int id) { //#endif if (serverData != null) { - serverData.setResourcePackState(result ? ServerInfo.ResourcePackState.ENABLED : ServerInfo.ResourcePackState.DISABLED); + serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED); } if (result) { - netManager.send(makeStatusPacket(hash, Status.ACCEPTED)); + netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED)); downloadResourcePackFuture(requestId, url, hash); } else { - netManager.send(makeStatusPacket(hash, Status.DECLINED)); + netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED)); } - ServerList.updateServerListEntry(serverData); - mc.openScreen(null); + ServerList.saveSingleServer(serverData); + mc.displayGuiScreen(null); } //#if MC>=11400 - , new TranslatableText("multiplayer.texturePrompt.line1"), new TranslatableText("multiplayer.texturePrompt.line2")))); + , new TranslationTextComponent("multiplayer.texturePrompt.line1"), new TranslationTextComponent("multiplayer.texturePrompt.line2")))); //#else //$$ }, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0))); //#endif } } - return new ResourcePackSendS2CPacket("replay://" + requestId, ""); + return new SSendResourcePackPacket("replay://" + requestId, ""); } private void downloadResourcePackFuture(int requestId, String url, final String hash) { addCallback(downloadResourcePack(requestId, url, hash), - result -> mc.getNetworkHandler().sendPacket(makeStatusPacket(hash, Status.SUCCESSFULLY_LOADED)), - throwable -> mc.getNetworkHandler().sendPacket(makeStatusPacket(hash, Status.FAILED_DOWNLOAD))); + result -> mc.getConnection().sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED)), + throwable -> mc.getConnection().sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD))); } private @@ -188,9 +188,9 @@ private void downloadResourcePackFuture(int requestId, String url, final String //$$ ListenableFuture //#endif downloadResourcePack(final int requestId, String url, String hash) { - ClientBuiltinResourcePackProvider packFinder = mc.getResourcePackDownloader(); + DownloadingPackFinder packFinder = mc.getPackFinder(); ((IDownloadingPackFinder) packFinder).setRequestCallback(file -> recordResourcePack(file, requestId)); - return packFinder.download(url, hash); + return packFinder.downloadResourcePack(url, hash); } public interface IDownloadingPackFinder { diff --git a/src/main/java/com/replaymod/render/CameraPathExporter.java b/src/main/java/com/replaymod/render/CameraPathExporter.java index 7bf0c23a..1108670f 100644 --- a/src/main/java/com/replaymod/render/CameraPathExporter.java +++ b/src/main/java/com/replaymod/render/CameraPathExporter.java @@ -19,13 +19,13 @@ import de.javagl.jgltf.model.io.v2.GltfAssetWriterV2; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Quaternion; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector4f; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import org.apache.commons.io.FilenameUtils; import org.lwjgl.opengl.GL11; //#if MC>=11400 -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.vector.Vector3d; //#else //#endif @@ -39,7 +39,7 @@ public class CameraPathExporter { - private final MinecraftClient mc = MCVer.getMinecraft(); + private final Minecraft mc = MCVer.getMinecraft(); private final RenderSettings settings; private int framesDone; private ByteBuffer timeBuffer; @@ -58,14 +58,14 @@ public void setup(int totalFrames) { public void recordFrame(float tickDelta) { //#if MC>=10800 - Entity entity = mc.getCameraEntity() == null ? mc.player : mc.getCameraEntity(); + Entity entity = mc.getRenderViewEntity() == null ? mc.player : mc.getRenderViewEntity(); //#else //$$ Entity entity = mc.renderViewEntity == null ? mc.thePlayer : mc.renderViewEntity; //#endif //#if MC>=11400 - net.minecraft.client.render.Camera camera = mc.gameRenderer.getCamera(); - Vec3d vec = camera.getPos(); + net.minecraft.client.renderer.ActiveRenderInfo camera = mc.gameRenderer.getActiveRenderInfo(); + Vector3d vec = camera.getProjectedView(); float x = (float) vec.getX(); float y = (float) vec.getY(); float z = (float) vec.getZ(); @@ -166,9 +166,9 @@ public void finish() throws IOException { camera.setPerspective(configure(new CameraPerspective(), perspective -> { float aspectRatio = (float) settings.getVideoWidth() / (float) settings.getVideoHeight(); perspective.setAspectRatio(aspectRatio); - perspective.setYfov((float) Math.toRadians(mc.options.fov)); + perspective.setYfov((float) Math.toRadians(mc.gameSettings.fov)); perspective.setZnear(0.05f); - perspective.setZfar((float) mc.options.viewDistance * 16 * 4); + perspective.setZfar((float) mc.gameSettings.renderDistanceChunks * 16 * 4); })); })); glTF.addNodes(configure(new Node(), node -> node.setCamera(0))); diff --git a/src/main/java/com/replaymod/render/EXRWriter.java b/src/main/java/com/replaymod/render/EXRWriter.java index 1b2348fe..732a826e 100644 --- a/src/main/java/com/replaymod/render/EXRWriter.java +++ b/src/main/java/com/replaymod/render/EXRWriter.java @@ -7,7 +7,7 @@ import com.replaymod.render.rendering.FrameConsumer; import com.replaymod.render.utils.ByteBufferPool; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.crash.CrashReport; import org.lwjgl.PointerBuffer; import org.lwjgl.util.tinyexr.EXRChannelInfo; import org.lwjgl.util.tinyexr.EXRHeader; @@ -110,7 +110,7 @@ public void consume(Map channels) { throw new IOException(message); } } catch (Throwable t) { - MCVer.getMinecraft().setCrashReport(CrashReport.create(t, "Exporting EXR frame")); + MCVer.getMinecraft().crashed(CrashReport.makeCrashReport(t, "Exporting EXR frame")); } finally { memFree(images); stackPop(); diff --git a/src/main/java/com/replaymod/render/FFmpegWriter.java b/src/main/java/com/replaymod/render/FFmpegWriter.java index f4e1381c..37c3df98 100644 --- a/src/main/java/com/replaymod/render/FFmpegWriter.java +++ b/src/main/java/com/replaymod/render/FFmpegWriter.java @@ -8,8 +8,8 @@ import com.replaymod.render.utils.ByteBufferPool; import com.replaymod.render.utils.StreamPipe; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; import org.apache.commons.exec.CommandLine; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -70,7 +70,7 @@ public FFmpegWriter(final VideoRenderer renderer) throws IOException { } catch (IOException e) { throw new NoFFmpegException(e); } - File exportLogFile = new File(MCVer.getMinecraft().runDirectory, "export.log"); + File exportLogFile = new File(MCVer.getMinecraft().gameDir, "export.log"); OutputStream exportLogOut = new TeeOutputStream(new FileOutputStream(exportLogFile), ffmpegLog); new StreamPipe(process.getInputStream(), exportLogOut).start(); new StreamPipe(process.getErrorStream(), exportLogOut).start(); @@ -124,11 +124,11 @@ public void consume(Map channels) { renderer.setFailure(e); return; } - CrashReport report = CrashReport.create(t, "Exporting frame"); - CrashReportSection exportDetails = report.addElement("Export details"); - exportDetails.add("Export command", settings::getExportCommand); - exportDetails.add("Export args", commandArgs::toString); - MCVer.getMinecraft().setCrashReport(report); + CrashReport report = CrashReport.makeCrashReport(t, "Exporting frame"); + CrashReportCategory exportDetails = report.makeCategory("Export details"); + exportDetails.addDetail("Export command", settings::getExportCommand); + exportDetails.addDetail("Export args", commandArgs::toString); + MCVer.getMinecraft().crashed(report); } finally { channels.values().forEach(it -> ByteBufferPool.release(it.getByteBuffer())); } diff --git a/src/main/java/com/replaymod/render/PNGWriter.java b/src/main/java/com/replaymod/render/PNGWriter.java index 7d0abe32..6476ba31 100644 --- a/src/main/java/com/replaymod/render/PNGWriter.java +++ b/src/main/java/com/replaymod/render/PNGWriter.java @@ -8,7 +8,7 @@ import com.replaymod.render.utils.ByteBufferPool; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.Image; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.crash.CrashReport; import java.io.IOException; import java.nio.ByteBuffer; @@ -40,7 +40,7 @@ public void consume(Map channels) { image.writePNG(outputFolder.resolve(depthFrame.getFrameId() + ".depth.png").toFile())); } } catch (Throwable t) { - MCVer.getMinecraft().setCrashReport(CrashReport.create(t, "Exporting EXR frame")); + MCVer.getMinecraft().crashed(CrashReport.makeCrashReport(t, "Exporting EXR frame")); } finally { channels.values().forEach(it -> ByteBufferPool.release(it.getByteBuffer())); } diff --git a/src/main/java/com/replaymod/render/RenderSettings.java b/src/main/java/com/replaymod/render/RenderSettings.java index bfc8783f..870eee6d 100644 --- a/src/main/java/com/replaymod/render/RenderSettings.java +++ b/src/main/java/com/replaymod/render/RenderSettings.java @@ -3,7 +3,7 @@ import com.google.gson.annotations.SerializedName; import com.replaymod.core.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; import net.minecraft.util.Util; import org.apache.maven.artifact.versioning.ComparableVersion; @@ -26,11 +26,11 @@ public enum RenderMethod { @Override public String toString() { - return I18n.translate("replaymod.gui.rendersettings.renderer." + name().toLowerCase()); + return I18n.format("replaymod.gui.rendersettings.renderer." + name().toLowerCase()); } public String getDescription() { - return I18n.translate("replaymod.gui.rendersettings.renderer." + name().toLowerCase() + ".description"); + return I18n.format("replaymod.gui.rendersettings.renderer." + name().toLowerCase() + ".description"); } public boolean isSpherical() { @@ -98,7 +98,7 @@ public boolean hasBitrateSetting() { @Override public String toString() { - return I18n.translate("replaymod.gui.rendersettings.presets." + name().replace('_', '.').toLowerCase()); + return I18n.format("replaymod.gui.rendersettings.presets." + name().replace('_', '.').toLowerCase()); } public boolean isSupported() { @@ -136,7 +136,7 @@ public int getFactor() { @Override public String toString() { - return I18n.translate("replaymod.gui.rendersettings.antialiasing." + name().toLowerCase()); + return I18n.format("replaymod.gui.rendersettings.antialiasing." + name().toLowerCase()); } } @@ -288,10 +288,10 @@ public String getExportCommandOrDefault() { } private static String findFFmpeg() { - switch (Util.getOperatingSystem()) { + switch (Util.getOSType()) { case WINDOWS: // Allow windows users to unpack the ffmpeg archive into a sub-folder of their .minecraft folder - File dotMinecraft = MCVer.getMinecraft().runDirectory; + File dotMinecraft = MCVer.getMinecraft().gameDir; File inDotMinecraft = new File(dotMinecraft, "ffmpeg/bin/ffmpeg.exe"); if (inDotMinecraft.exists()) { LOGGER.debug("FFmpeg found in .minecraft/ffmpeg"); diff --git a/src/main/java/com/replaymod/render/ReplayModRender.java b/src/main/java/com/replaymod/render/ReplayModRender.java index 4e1e84fd..63abd70e 100644 --- a/src/main/java/com/replaymod/render/ReplayModRender.java +++ b/src/main/java/com/replaymod/render/ReplayModRender.java @@ -10,8 +10,8 @@ import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.gui.container.VanillaGuiScreen; import com.replaymod.gui.utils.EventRegistrations; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashException; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.ReportedException; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -50,17 +50,17 @@ public void initClient() { public File getVideoFolder() { String path = core.getSettingsRegistry().get(Setting.RENDER_PATH); - File folder = new File(path.startsWith("./") ? core.getMinecraft().runDirectory : null, path); + File folder = new File(path.startsWith("./") ? core.getMinecraft().gameDir : null, path); try { FileUtils.forceMkdir(folder); } catch (IOException e) { - throw new CrashException(CrashReport.create(e, "Cannot create video folder.")); + throw new ReportedException(CrashReport.makeCrashReport(e, "Cannot create video folder.")); } return folder; } public Path getRenderSettingsPath() { - return core.getMinecraft().runDirectory.toPath().resolve("config/replaymod-rendersettings.json"); + return core.getMinecraft().gameDir.toPath().resolve("config/replaymod-rendersettings.json"); } public List getRenderQueue() { @@ -73,7 +73,7 @@ private void onReplayOpened(ReplayHandler replayHandler) { try { renderQueue.addAll(RenderJob.readQueue(replayFile)); } catch (IOException e) { - throw new CrashException(CrashReport.create(e, "Reading timeline")); + throw new ReportedException(CrashReport.makeCrashReport(e, "Reading timeline")); } } @@ -89,7 +89,7 @@ public void saveRenderQueue() { } catch (IOException e) { e.printStackTrace(); VanillaGuiScreen screen = VanillaGuiScreen.wrap(getCore().getMinecraft().currentScreen); - CrashReport report = CrashReport.create(e, "Reading timeline"); + CrashReport report = CrashReport.makeCrashReport(e, "Reading timeline"); Utils.error(LOGGER, screen, report, () -> {}); } } diff --git a/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java b/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java index d9db73ee..5830796f 100644 --- a/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java +++ b/src/main/java/com/replaymod/render/blend/BlendFrameCapturer.java @@ -7,7 +7,7 @@ import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.utils.ByteBufferPool; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import java.io.IOException; import java.util.Collections; @@ -37,7 +37,7 @@ public Map process() { renderInfo.updateForNextFrame(); BlendState.getState().preFrame(framesDone); - worldRenderer.renderWorld(MinecraftClient.getInstance().getTickDelta(), null); + worldRenderer.renderWorld(Minecraft.getInstance().getRenderPartialTicks(), null); BlendState.getState().postFrame(framesDone); BitmapFrame frame = new BitmapFrame(framesDone++, new Dimension(0, 0), 0, ByteBufferPool.allocate(0)); diff --git a/src/main/java/com/replaymod/render/blend/BlendMaterials.java b/src/main/java/com/replaymod/render/blend/BlendMaterials.java index 4aca95a6..b7c295fb 100644 --- a/src/main/java/com/replaymod/render/blend/BlendMaterials.java +++ b/src/main/java/com/replaymod/render/blend/BlendMaterials.java @@ -5,7 +5,7 @@ import com.replaymod.render.blend.data.DPackedFile; import com.replaymod.render.blend.data.DTexture; import com.replaymod.gui.versions.Image; -import net.minecraft.client.util.GlAllocationUtils; +import net.minecraft.client.renderer.GLAllocation; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; @@ -25,7 +25,7 @@ public DMaterial getActiveMaterial() { // Read raw image data from GL int width = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); int height = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); - ByteBuffer buffer = GlAllocationUtils.allocateByteBuffer(width * height * 4); + ByteBuffer buffer = GLAllocation.createDirectByteBuffer(width * height * 4); GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer); // Convert to Image diff --git a/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java b/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java index 49dba018..752ea25b 100644 --- a/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java +++ b/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java @@ -6,10 +6,10 @@ import de.johni0702.minecraft.gui.utils.lwjgl.vector.ReadableVector3f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector2f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormatElement; -import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.renderer.vertex.VertexFormatElement; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import org.lwjgl.opengl.GL11; //#if MC>=11500 @@ -18,7 +18,7 @@ //#if MC>=10904 //#if MC>=11200 -import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.renderer.BufferBuilder; //#else //$$ import net.minecraft.client.renderer.VertexBuffer; //#endif @@ -73,7 +73,7 @@ public void begin(int mode, VertexFormat vertexFormat) { // Someone probably finished drawing with the global instance instead of this one, // let's just assume that what's happened and finish our last draw by ourselves // (might miss correct texture though) - super.end(); + super.finishDrawing(); addBufferToMesh(); } else { throw new IllegalStateException("Already drawing!"); @@ -83,7 +83,7 @@ public void begin(int mode, VertexFormat vertexFormat) { if (!wellBehaved) { // In case the calling code finishes with Tessellator.getInstance().draw() - Tessellator.getInstance().getBuffer().begin(mode, VertexFormats.POSITION_TEXTURE_COLOR); + Tessellator.getInstance().getBuffer().begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR); } //#if MC>=10809 @@ -96,14 +96,14 @@ public void begin(int mode, VertexFormat vertexFormat) { public void maybeFinishDrawing() { if (isDrawing) { isDrawing = false; - super.end(); + super.finishDrawing(); addBufferToMesh(); } } @Override //#if MC>=10809 - public void end() { + public void finishDrawing() { //#else //$$ public int finishDrawing() { //#endif @@ -111,13 +111,13 @@ public void end() { throw new IllegalStateException("Not building!"); } else { if (!wellBehaved) { - Tessellator.getInstance().getBuffer().end(); + Tessellator.getInstance().getBuffer().finishDrawing(); } //#if MC<10809 //$$ int ret = //#endif - super.end(); + super.finishDrawing(); addBufferToMesh(); @@ -141,8 +141,8 @@ public static DMesh addBufferToMesh(BufferBuilder bufferBuilder, DMesh mesh, Rea //$$ public static DMesh addBufferToMesh(WorldRenderer bufferBuilder, DMesh mesh, Vector3f vertOffset) { //#endif //#if MC>=11500 - Pair data = bufferBuilder.popData(); - return addBufferToMesh(data.getSecond(), data.getFirst().getMode(), data.getFirst().getVertexFormat(), mesh, vertOffset); + Pair data = bufferBuilder.getNextBuffer(); + return addBufferToMesh(data.getSecond(), data.getFirst().getDrawMode(), data.getFirst().getFormat(), mesh, vertOffset); //#else //$$ return addBufferToMesh(bufferBuilder.getByteBuffer(), bufferBuilder.getDrawMode(), bufferBuilder.getVertexFormat(), mesh, vertOffset); //#endif @@ -150,7 +150,7 @@ public static DMesh addBufferToMesh(BufferBuilder bufferBuilder, DMesh mesh, Rea public static DMesh addBufferToMesh(ByteBuffer buffer, int mode, VertexFormat vertexFormat, DMesh mesh, ReadableVector3f vertOffset) { //#if MC>=11400 - int vertexCount = buffer.remaining() / vertexFormat.getVertexSize(); + int vertexCount = buffer.remaining() / vertexFormat.getSize(); //#else //$$ int vertexCount = buffer.remaining() / vertexFormat.getNextOffset(); //#endif @@ -182,10 +182,10 @@ public static DMesh addBufferToMesh(ByteBuffer buffer, int vertexCount, int mode //$$ int offset = element.getOffset(); //#endif //#endif - switch (element.getType()) { + switch (element.getUsage()) { case POSITION: //#if MC>=11400 - if (element.getFormat() != VertexFormatElement.Format.FLOAT) { + if (element.getType() != VertexFormatElement.Type.FLOAT) { //#else //$$ if (element.getType() != VertexFormatElement.EnumType.FLOAT) { //#endif @@ -195,7 +195,7 @@ public static DMesh addBufferToMesh(ByteBuffer buffer, int vertexCount, int mode break; case COLOR: //#if MC>=11400 - if (element.getFormat() != VertexFormatElement.Format.UBYTE) { + if (element.getType() != VertexFormatElement.Type.UBYTE) { //#else //$$ if (element.getType() != VertexFormatElement.EnumType.UBYTE) { //#endif @@ -206,7 +206,7 @@ public static DMesh addBufferToMesh(ByteBuffer buffer, int vertexCount, int mode case UV: if (element.getIndex() != 0) break; //#if MC>=11400 - if (element.getFormat() != VertexFormatElement.Format.FLOAT) { + if (element.getType() != VertexFormatElement.Type.FLOAT) { //#else //$$ if (element.getType() != VertexFormatElement.EnumType.UBYTE) { //#endif @@ -224,7 +224,7 @@ public static DMesh addBufferToMesh(ByteBuffer buffer, int vertexCount, int mode List uvs = new ArrayList<>(vertexCount); List colors = new ArrayList<>(vertexCount); //#if MC>=11400 - int step = vertexFormat.getVertexSize(); + int step = vertexFormat.getSize(); //#else //$$ int step = vertexFormat.getNextOffset(); //#endif diff --git a/src/main/java/com/replaymod/render/blend/BlendState.java b/src/main/java/com/replaymod/render/blend/BlendState.java index 0ef4a29b..8f1a6512 100644 --- a/src/main/java/com/replaymod/render/blend/BlendState.java +++ b/src/main/java/com/replaymod/render/blend/BlendState.java @@ -13,9 +13,9 @@ import com.replaymod.render.blend.exporters.RenderState; import com.replaymod.render.blend.exporters.TileEntityExporter; //#endif -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; +import net.minecraft.crash.ReportedException; import org.apache.commons.io.output.NullOutputStream; import org.blender.utils.BlenderFactory; import org.cakelab.blender.io.BlenderFile; @@ -86,10 +86,10 @@ public void setup() { try { exporter.setup(); } catch (IOException e) { - CrashReport report = CrashReport.create(e, "Setup of blend exporter"); - CrashReportSection category = report.addElement("Exporter"); - category.add("Exporter", exporter::toString); - throw new CrashException(report); + CrashReport report = CrashReport.makeCrashReport(e, "Setup of blend exporter"); + CrashReportCategory category = report.makeCategory("Exporter"); + category.addDetail("Exporter", exporter::toString); + throw new ReportedException(report); } } } @@ -100,10 +100,10 @@ public void tearDown() { try { exporter.tearDown(); } catch (IOException e) { - CrashReport report = CrashReport.create(e, "Tear down of blend exporter"); - CrashReportSection category = report.addElement("Exporter"); - category.add("Exporter", exporter::toString); - throw new CrashException(report); + CrashReport report = CrashReport.makeCrashReport(e, "Tear down of blend exporter"); + CrashReportCategory category = report.makeCategory("Exporter"); + category.addDetail("Exporter", exporter::toString); + throw new ReportedException(report); } } @@ -137,11 +137,11 @@ public void preFrame(int frame) { try { exporter.preFrame(frame); } catch (IOException e) { - CrashReport report = CrashReport.create(e, "Pre frame of blend exporter"); - CrashReportSection category = report.addElement("Exporter"); - category.add("Exporter", exporter::toString); - category.add("Frame", () -> String.valueOf(frame)); - throw new CrashException(report); + CrashReport report = CrashReport.makeCrashReport(e, "Pre frame of blend exporter"); + CrashReportCategory category = report.makeCategory("Exporter"); + category.addDetail("Exporter", exporter::toString); + category.addDetail("Frame", () -> String.valueOf(frame)); + throw new ReportedException(report); } } } @@ -152,11 +152,11 @@ public void postFrame(int frame) { try { exporter.postFrame(frame); } catch (IOException e) { - CrashReport report = CrashReport.create(e, "Post frame of blend exporter"); - CrashReportSection category = report.addElement("Exporter"); - category.add("Exporter", exporter::toString); - category.add("Frame", () -> String.valueOf(frame)); - throw new CrashException(report); + CrashReport report = CrashReport.makeCrashReport(e, "Post frame of blend exporter"); + CrashReportCategory category = report.makeCategory("Exporter"); + category.addDetail("Exporter", exporter::toString); + category.addDetail("Frame", () -> String.valueOf(frame)); + throw new ReportedException(report); } } diff --git a/src/main/java/com/replaymod/render/blend/Util.java b/src/main/java/com/replaymod/render/blend/Util.java index d47092e7..cff8b6d2 100644 --- a/src/main/java/com/replaymod/render/blend/Util.java +++ b/src/main/java/com/replaymod/render/blend/Util.java @@ -4,10 +4,10 @@ import de.johni0702.minecraft.gui.utils.lwjgl.vector.Matrix4f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Quaternion; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.GlAllocationUtils; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.block.entity.BlockEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; import org.blender.dna.Link; import org.blender.dna.ListBase; import org.blender.utils.BlenderFactory; @@ -18,7 +18,7 @@ import java.nio.FloatBuffer; //#if MC>=11400 -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.vector.Vector3d; //#endif public class Util { @@ -39,7 +39,7 @@ public static int align(int size, int alignment) { } } - private static FloatBuffer floatBuffer = GlAllocationUtils.allocateFloatBuffer(16); + private static FloatBuffer floatBuffer = GLAllocation.createDirectFloatBuffer(16); public static Matrix4f getGlMatrix(int matrix) { floatBuffer.clear(); //#if MC>=11400 @@ -138,9 +138,9 @@ public static void glToBlend(Quaternion q) { //#if MC>=10800 public static Vector3f getCameraPos() { - MinecraftClient mc = MinecraftClient.getInstance(); + Minecraft mc = Minecraft.getInstance(); //#if MC>=11400 - Vec3d pos = mc.getEntityRenderDispatcher().camera.getPos(); + Vector3d pos = mc.getRenderManager().info.getProjectedView(); return new Vector3f((float) pos.x, (float) pos.y, (float) pos.z); //#else //$$ return new Vector3f( @@ -182,10 +182,10 @@ public static void insert(ListBase list, CPointer element) throws IOExcept } } - public static String getTileEntityId(BlockEntity tileEntity) { - CompoundTag nbt = new CompoundTag(); + public static String getTileEntityId(TileEntity tileEntity) { + CompoundNBT nbt = new CompoundNBT(); //#if MC>=11400 - tileEntity.toTag(nbt); + tileEntity.write(nbt); //#else //$$ tileEntity.writeToNBT(nbt); //#endif diff --git a/src/main/java/com/replaymod/render/blend/exporters/EntityExporter.java b/src/main/java/com/replaymod/render/blend/exporters/EntityExporter.java index 8b6834b7..b0dbc09c 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/EntityExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/EntityExporter.java @@ -7,7 +7,7 @@ import com.replaymod.render.blend.data.DObject; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Matrix4f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; @@ -18,7 +18,7 @@ import static com.replaymod.render.blend.Util.getGlModelViewMatrix; public class EntityExporter implements Exporter { - private final MinecraftClient mc = MCVer.getMinecraft(); + private final Minecraft mc = MCVer.getMinecraft(); private final RenderState renderState; private DObject entitiesObject; private Map entityObjects; diff --git a/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java index 54de89d1..27e95d29 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java @@ -5,20 +5,20 @@ import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DObject; -import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.ItemStack; -import net.minecraft.util.math.Direction; +import net.minecraft.util.Direction; import org.lwjgl.opengl.GL11; //#if MC>=11400 -import net.minecraft.util.math.Vec3i; +import net.minecraft.util.math.vector.Vector3i; //#else //$$ import net.minecraftforge.client.model.pipeline.LightUtil; //#endif //#if MC>=11400 -import net.minecraft.client.render.model.BakedQuad; -import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.IBakedModel; //#else //$$ import net.minecraft.client.renderer.block.model.BakedQuad; //#if MC>=10904 @@ -42,7 +42,7 @@ public ItemExporter(RenderState renderState) { this.renderState = renderState; } - public void onRender(Object renderItem, BakedModel model, ItemStack stack) { + public void onRender(Object renderItem, IBakedModel model, ItemStack stack) { DObject object = getObjectForItemStack(renderItem, model, stack); renderState.pushObject(object); @@ -55,7 +55,7 @@ public void onRender(Object renderItem, BakedModel model, ItemStack stack) { renderState.pop(); } - private DObject getObjectForItemStack(Object renderItem, BakedModel model, ItemStack stack) { + private DObject getObjectForItemStack(Object renderItem, IBakedModel model, ItemStack stack) { int frame = renderState.getFrame(); DObject parent = renderState.peekObject(); DObject object = null; @@ -70,7 +70,7 @@ private DObject getObjectForItemStack(Object renderItem, BakedModel model, ItemS if (object == null) { object = new ItemBasedDObject(renderItem, model, stack); //#if MC>=11400 - object.id.name = stack.getName().getString(); + object.id.name = stack.getDisplayName().getString(); //#else //$$ object.id.name = stack.getDisplayName(); //#endif @@ -81,12 +81,12 @@ private DObject getObjectForItemStack(Object renderItem, BakedModel model, ItemS } @SuppressWarnings("unchecked") - private static DMesh generateMeshForItemStack(Object renderItem, BakedModel model, ItemStack stack) { + private static DMesh generateMeshForItemStack(Object renderItem, IBakedModel model, ItemStack stack) { DMesh mesh = new DMesh(); BlendMeshBuilder builder = new BlendMeshBuilder(mesh); builder.setWellBehaved(true); //#if MC>=10809 - builder.begin(GL11.GL_QUADS, VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL); + builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); //#else //$$ builder.startDrawingQuads(); //$$ builder.setVertexFormat(DefaultVertexFormats.ITEM); @@ -111,15 +111,15 @@ private static DMesh generateMeshForItemStack(Object renderItem, BakedModel mode //#endif //#endif - builder.end(); + builder.finishDrawing(); return mesh; } private static void renderQuads(Object renderItem, BlendMeshBuilder buffer, List quads, ItemStack stack) { for (BakedQuad quad : quads) { - int color = stack != null && quad.hasColor() + int color = stack != null && quad.hasTintIndex() //#if MC>=10904 - ? ((ItemRendererAccessor) renderItem).getItemColors().getColorMultiplier(stack, quad.getColorIndex()) | 0xff000000 + ? ((ItemRendererAccessor) renderItem).getItemColors().getColor(stack, quad.getTintIndex()) | 0xff000000 //#else //$$ ? stack.getItem().getColorFromItemStack(stack, quad.getTintIndex()) | 0xff000000 //#endif @@ -142,18 +142,18 @@ private static void renderQuads(Object renderItem, BlendMeshBuilder buffer, List private static class ItemBasedDObject extends DObject { private final Object renderItem; - private final BakedModel model; + private final IBakedModel model; private final ItemStack stack; private boolean valid; - public ItemBasedDObject(Object renderItem, BakedModel model, ItemStack stack) { + public ItemBasedDObject(Object renderItem, IBakedModel model, ItemStack stack) { super(generateMeshForItemStack(renderItem, model, stack)); this.renderItem = renderItem; this.model = model; this.stack = stack; } - public boolean isBasedOn(Object renderItem, BakedModel model, ItemStack stack) { + public boolean isBasedOn(Object renderItem, IBakedModel model, ItemStack stack) { return this.renderItem == renderItem && this.model == model && this.stack == stack; } diff --git a/src/main/java/com/replaymod/render/blend/exporters/ModelRendererExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ModelRendererExporter.java index 2320f236..580e9d62 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ModelRendererExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ModelRendererExporter.java @@ -9,11 +9,11 @@ //#if MC>=11400 //#if MC>=11500 -import net.minecraft.client.model.ModelPart.Cuboid; +import net.minecraft.client.renderer.model.ModelRenderer.ModelBox; //#else //$$ import net.minecraft.client.model.Box; //#endif -import net.minecraft.client.model.ModelPart; +import net.minecraft.client.renderer.model.ModelRenderer; //#else //$$ import net.minecraft.client.model.ModelBox; //$$ import net.minecraft.client.model.ModelRenderer; @@ -34,7 +34,7 @@ public ModelRendererExporter(RenderState renderState) { public void setup() throws IOException { } - public void preRenderModel(ModelPart model, float scale) { + public void preRenderModel(ModelRenderer model, float scale) { DObject object = getObjectForModel(model, scale); renderState.pushObject(object); renderState.pushModelView(); @@ -56,7 +56,7 @@ public void postRenderModel() { renderState.pop(); } - private DObject getObjectForModel(ModelPart model, float scale) { + private DObject getObjectForModel(ModelRenderer model, float scale) { int frame = renderState.getFrame(); DObject parent = renderState.peekObject(); DObject object = null; @@ -81,7 +81,7 @@ private DObject getObjectForModel(ModelPart model, float scale) { return object; } - private static DMesh generateMesh(ModelPart model, float scale) { + private static DMesh generateMesh(ModelRenderer model, float scale) { DMesh mesh = new DMesh(); BlendMeshBuilder builder = new BlendMeshBuilder(mesh); //#if MC>=11500 @@ -100,17 +100,17 @@ private static DMesh generateMesh(ModelPart model, float scale) { } private static class ModelBasedDObject extends DObject { - private final ModelPart model; + private final ModelRenderer model; private final float scale; private boolean valid; - public ModelBasedDObject(ModelPart model, float scale) { + public ModelBasedDObject(ModelRenderer model, float scale) { super(generateMesh(model, scale)); this.model = model; this.scale = scale; } - public boolean isBasedOn(ModelPart model, float scale) { + public boolean isBasedOn(ModelRenderer model, float scale) { return this.model == model && Math.abs(this.scale - scale) < 1e-4; } diff --git a/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java index 26bc85d7..6c63603a 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java @@ -10,10 +10,10 @@ import com.replaymod.mixin.ParticleAccessor; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Matrix4f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; //#if MC>=11400 -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.vector.Vector3d; //#endif //#if MC>=10904 @@ -24,7 +24,7 @@ //#endif //#if MC>=10809 -import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; //#endif import java.io.IOException; @@ -35,7 +35,7 @@ import static com.replaymod.render.blend.Util.getGlModelViewMatrix; public class ParticlesExporter implements Exporter { - private final MinecraftClient mc = MCVer.getMinecraft(); + private final Minecraft mc = MCVer.getMinecraft(); private final RenderState renderState; private DObject pointAtObject; private DObject particlesObject; @@ -169,14 +169,14 @@ private DMesh generateMeshForParticle(Particle particle, Vector3f offset) { builder.setReverseOffset(offset); builder.setWellBehaved(true); //#if MC>=10809 - builder.begin(7, VertexFormats.POSITION_TEXTURE_COLOR_LIGHT); + builder.begin(7, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP); //#else //$$ builder.startDrawingQuads(); //#endif //#if MC>=10809 - particle.buildGeometry(builder, + particle.renderParticle(builder, //#if MC>=11400 - MCVer.getMinecraft().gameRenderer.getCamera(), + MCVer.getMinecraft().gameRenderer.getActiveRenderInfo(), //#else //$$ MCVer.getMinecraft().getRenderViewEntity(), //#endif @@ -188,7 +188,7 @@ private DMesh generateMeshForParticle(Particle particle, Vector3f offset) { //#else //$$ particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0); //#endif - builder.end(); + builder.finishDrawing(); return mesh; } diff --git a/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java b/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java index 0fd15a81..1c21b18e 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java @@ -7,8 +7,8 @@ import com.replaymod.render.blend.data.DObject; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Matrix4f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import net.minecraft.client.MinecraftClient; -import net.minecraft.block.entity.BlockEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.tileentity.TileEntity; //#if MC>=10904 import net.minecraft.util.math.BlockPos; @@ -24,11 +24,11 @@ import static com.replaymod.render.blend.Util.getTileEntityId; public class TileEntityExporter implements Exporter { - private final MinecraftClient mc = MCVer.getMinecraft(); + private final Minecraft mc = MCVer.getMinecraft(); private final RenderState renderState; private DObject tileEntitiesObject; - private Map tileEntityObjects; - private Map tileEntityObjectsSeen; + private Map tileEntityObjects; + private Map tileEntityObjectsSeen; public TileEntityExporter(RenderState renderState) { this.renderState = renderState; @@ -52,9 +52,9 @@ public void preTileEntitiesRender() { // so we position it at 0/0/0 and instead have the tile entities themselves move more Matrix4f.translate(new Vector3f( //#if MC>=11400 - (float) -mc.getEntityRenderDispatcher().camera.getPos().x, - (float) -mc.getEntityRenderDispatcher().camera.getPos().y, - (float) -mc.getEntityRenderDispatcher().camera.getPos().z + (float) -mc.getRenderManager().info.getProjectedView().x, + (float) -mc.getRenderManager().info.getProjectedView().y, + (float) -mc.getRenderManager().info.getProjectedView().z //#else //$$ (float) -mc.getRenderManager().viewerPosX, //$$ (float) -mc.getRenderManager().viewerPosY, @@ -68,7 +68,7 @@ public void postTileEntitiesRender() { renderState.pop(); } - public void preRender(BlockEntity tileEntity, double dx, double dy, double dz, float renderPartialTicks, int destroyStage, float alpha) { + public void preRender(TileEntity tileEntity, double dx, double dy, double dz, float renderPartialTicks, int destroyStage, float alpha) { // FIXME: handle alpha DObject tileEntityObject = tileEntityObjects.get(tileEntity); if (tileEntityObject == null) { @@ -102,7 +102,7 @@ public void postRender() { @Override public void postFrame(int frame) throws IOException { - for (Map.Entry entry : tileEntityObjects.entrySet()) { + for (Map.Entry entry : tileEntityObjects.entrySet()) { if (!tileEntityObjectsSeen.containsKey(entry.getKey())) { DObject object = entry.getValue(); object.keyframe("hide", 0, renderState.getFrame(), 1f); diff --git a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java index 69c6d253..725059d3 100644 --- a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java @@ -11,9 +11,9 @@ import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.shader.Program; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashException; -import net.minecraft.util.Identifier; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.ReportedException; +import net.minecraft.util.ResourceLocation; import static com.mojang.blaze3d.platform.GlStateManager.*; @@ -26,8 +26,8 @@ import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; public class ODSFrameCapturer implements FrameCapturer { - private static final Identifier vertexResource = new Identifier("replaymod", "shader/ods.vert"); - private static final Identifier fragmentResource = new Identifier("replaymod", "shader/ods.frag"); + private static final ResourceLocation vertexResource = new ResourceLocation("replaymod", "shader/ods.vert"); + private static final ResourceLocation fragmentResource = new ResourceLocation("replaymod", "shader/ods.frag"); private final CubicPboOpenGlFrameCapturer left, right; private final Program shaderProgram; @@ -77,7 +77,7 @@ public RenderSettings getRenderSettings() { leftEyeVariable = shaderProgram.getUniformVariable("leftEye"); directionVariable = shaderProgram.getUniformVariable("direction"); } catch (Exception e) { - throw new CrashException(CrashReport.create(e, "Creating ODS shaders")); + throw new ReportedException(CrashReport.makeCrashReport(e, "Creating ODS shaders")); } } @@ -168,7 +168,7 @@ protected OpenGlFrame renderFrame(int frameId, float partialTicks, CubicOpenGlFr resizeMainWindow(mc, getFrameWidth(), getFrameHeight()); pushMatrix(); - frameBuffer().beginWrite(true); + frameBuffer().bindFramebuffer(true); clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT //#if MC>=11400 @@ -180,7 +180,7 @@ protected OpenGlFrame renderFrame(int frameId, float partialTicks, CubicOpenGlFr directionVariable.set(captureData.ordinal()); worldRenderer.renderWorld(partialTicks, null); - frameBuffer().endWrite(); + frameBuffer().unbindFramebuffer(); popMatrix(); return captureFrame(frameId, captureData); diff --git a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java index f5b89064..79360718 100644 --- a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java @@ -8,8 +8,8 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.Framebuffer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.shader.Framebuffer; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; @@ -32,7 +32,7 @@ public abstract class OpenGlFrameCapturer=11400 @@ -95,7 +95,7 @@ protected OpenGlFrame renderFrame(int frameId, float partialTicks, D captureData worldRenderer.renderWorld(partialTicks, captureData); - frameBuffer().endWrite(); + frameBuffer().unbindFramebuffer(); popMatrix(); return captureFrame(frameId, captureData); @@ -103,9 +103,9 @@ protected OpenGlFrame renderFrame(int frameId, float partialTicks, D captureData protected OpenGlFrame captureFrame(int frameId, D captureData) { ByteBuffer buffer = ByteBufferPool.allocate(getFrameWidth() * getFrameHeight() * 4); - frameBuffer().beginWrite(true); + frameBuffer().bindFramebuffer(true); GL11.glReadPixels(0, 0, getFrameWidth(), getFrameHeight(), GL12.GL_BGRA, GL11.GL_UNSIGNED_BYTE, buffer); - frameBuffer().endWrite(); + frameBuffer().unbindFramebuffer(); buffer.rewind(); return new OpenGlFrame(frameId, new Dimension(getFrameWidth(), getFrameHeight()), 4, buffer); diff --git a/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java index 1df3a708..6067fa42 100644 --- a/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java @@ -93,13 +93,13 @@ protected OpenGlFrame captureFrame(int frameId, D captureData) { pbo.bind(); int offset = captureData.ordinal() * getFrameWidth() * getFrameHeight() * 4; - frameBuffer().beginWrite(true); + frameBuffer().bindFramebuffer(true); GL11.glReadPixels(0, 0, getFrameWidth(), getFrameHeight(), GL12.GL_BGRA, GL11.GL_UNSIGNED_BYTE, offset); if (withDepth) { offset += data.length * getFrameWidth() * getFrameHeight() * 4; GL11.glReadPixels(0, 0, getFrameWidth(), getFrameHeight(), GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, offset); } - frameBuffer().endWrite(); + frameBuffer().unbindFramebuffer(); pbo.unbind(); return null; diff --git a/src/main/java/com/replaymod/render/gui/GuiExportFailed.java b/src/main/java/com/replaymod/render/gui/GuiExportFailed.java index 9ba58170..720ab1ae 100644 --- a/src/main/java/com/replaymod/render/gui/GuiExportFailed.java +++ b/src/main/java/com/replaymod/render/gui/GuiExportFailed.java @@ -12,9 +12,9 @@ import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.layout.VerticalLayout; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; +import net.minecraft.crash.ReportedException; import java.util.Arrays; import java.util.function.Consumer; @@ -30,11 +30,11 @@ public static GuiExportFailed tryToRecover(FFmpegWriter.FFmpegStartupException e // Check whether the user has configured some custom ffmpeg arguments if (settings.getEncodingPreset().getValue().equals(settings.getExportArguments())) { // If they haven't, then this is probably a faulty ffmpeg installation and there's nothing we can do - CrashReport crashReport = CrashReport.create(e, "Exporting video"); - CrashReportSection details = crashReport.addElement("Export details"); - details.add("Settings", settings::toString); - details.add("FFmpeg log", e::getLog); - throw new CrashException(crashReport); + CrashReport crashReport = CrashReport.makeCrashReport(e, "Exporting video"); + CrashReportCategory details = crashReport.makeCategory("Export details"); + details.addDetail("Settings", settings::toString); + details.addDetail("FFmpeg log", e::getLog); + throw new ReportedException(crashReport); } else { // If they have, ask them whether it was intentional GuiExportFailed gui = new GuiExportFailed(e, doRestart); @@ -108,7 +108,7 @@ public GuiExportFailed(FFmpegWriter.FFmpegStartupException e, Consumer { // Assume they know what they're doing - getMinecraft().openScreen(null); + getMinecraft().displayGuiScreen(null); }); } } diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java b/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java index 4b2f2356..bd602ce8 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java @@ -35,9 +35,9 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.NoticeScreen; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.AlertScreen; +import net.minecraft.crash.CrashReport; import org.apache.commons.io.IOUtils; import java.io.File; @@ -53,7 +53,7 @@ import static com.replaymod.render.ReplayModRender.LOGGER; //#if MC>=11400 -import net.minecraft.text.TranslatableText; +import net.minecraft.util.text.TranslationTextComponent; //#else //$$ import com.replaymod.replaystudio.util.I18n; //#endif @@ -166,10 +166,10 @@ public GuiRenderQueue(AbstractGuiScreen container, ReplayHandler replayHandle } private static void processQueue(AbstractGuiScreen container, ReplayHandler replayHandler, Iterable queue, Runnable done) { - MinecraftClient mc = MCVer.getMinecraft(); + Minecraft mc = MCVer.getMinecraft(); // Close all GUIs (so settings in GuiRenderSettings are saved) - mc.openScreen(null); + mc.displayGuiScreen(null); // Start rendering int jobsDone = 0; for (RenderJob renderJob : queue) { @@ -179,17 +179,17 @@ private static void processQueue(AbstractGuiScreen container, ReplayHandler r videoRenderer.renderVideo(); } catch (FFmpegWriter.NoFFmpegException e) { LOGGER.error("Rendering video:", e); - NoticeScreen errorScreen = new NoticeScreen( + AlertScreen errorScreen = new AlertScreen( //#if MC>=11400 container::display, - new TranslatableText("replaymod.gui.rendering.error.title"), - new TranslatableText("replaymod.gui.rendering.error.message") + new TranslationTextComponent("replaymod.gui.rendering.error.title"), + new TranslationTextComponent("replaymod.gui.rendering.error.message") //#else //$$ I18n.format("replaymod.gui.rendering.error.title"), //$$ I18n.format("replaymod.gui.rendering.error.message") //#endif ); - mc.openScreen(errorScreen); + mc.displayGuiScreen(errorScreen); return; } catch (FFmpegWriter.FFmpegStartupException e) { int jobsToSkip = jobsDone; @@ -201,7 +201,7 @@ private static void processQueue(AbstractGuiScreen container, ReplayHandler r }); return; } catch (Throwable t) { - Utils.error(LOGGER, container, CrashReport.create(t, "Rendering video"), () -> {}); + Utils.error(LOGGER, container, CrashReport.makeCrashReport(t, "Rendering video"), () -> {}); container.display(); // Re-show the queue popup and the new error popup return; } @@ -229,7 +229,7 @@ public static void processMultipleReplays( replayFile = mod.getCore().openReplay(next.getKey().toPath()); replayHandler = mod.startReplay(replayFile, true, false); } catch (IOException e) { - Utils.error(LOGGER, container, CrashReport.create(e, "Opening replay"), () -> {}); + Utils.error(LOGGER, container, CrashReport.makeCrashReport(e, "Opening replay"), () -> {}); container.display(); // Re-show the queue popup and the new error popup IOUtils.closeQuietly(replayFile); return; @@ -242,7 +242,7 @@ public static void processMultipleReplays( } ReplaySender replaySender = replayHandler.getReplaySender(); - MinecraftClient mc = mod.getCore().getMinecraft(); + Minecraft mc = mod.getCore().getMinecraft(); int jumpTo = 1000; while (mc.world == null && jumpTo < replayHandler.getReplayDuration()) { replaySender.sendPacketsTill(jumpTo); @@ -259,7 +259,7 @@ public static void processMultipleReplays( try { replayHandler.endReplay(); } catch (IOException e) { - Utils.error(LOGGER, container, CrashReport.create(e, "Closing replay"), () -> {}); + Utils.error(LOGGER, container, CrashReport.makeCrashReport(e, "Closing replay"), () -> {}); container.display(); // Re-show the queue popup and the new error popup return; } diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java index 38656856..e0cd4905 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java @@ -33,9 +33,9 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.gui.screen.NoticeScreen; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.client.gui.screen.AlertScreen; +import net.minecraft.client.resources.I18n; +import net.minecraft.crash.CrashReport; import java.io.File; import java.io.FileNotFoundException; @@ -53,7 +53,7 @@ import static com.replaymod.render.ReplayModRender.LOGGER; //#if MC>=11400 -import net.minecraft.text.TranslatableText; +import net.minecraft.util.text.TranslationTextComponent; //#endif public class GuiRenderSettings extends AbstractGuiPopup { @@ -109,7 +109,7 @@ public void consume(Integer old) { public final com.replaymod.gui.element.GuiSlider frameRateSlider = new com.replaymod.gui.element.GuiSlider().onValueChanged(new Runnable() { @Override public void run() { - frameRateSlider.setText(I18n.translate("replaymod.gui.rendersettings.framerate") + frameRateSlider.setText(I18n.format("replaymod.gui.rendersettings.framerate") + ": " + (frameRateSlider.getValue() + 10)); } }).setSize(122, 20).setSteps(110); @@ -171,7 +171,7 @@ public void run() { .onValueChanged(new Runnable() { @Override public void run() { - sphericalFovSlider.setText(I18n.translate("replaymod.gui.rendersettings.sphericalFov") + sphericalFovSlider.setText(I18n.format("replaymod.gui.rendersettings.sphericalFov") + ": " + (MIN_SPHERICAL_FOV + sphericalFovSlider.getValue() * SPHERICAL_FOV_STEP_SIZE) + "°"); updateInputs(); @@ -243,17 +243,17 @@ public void run() { videoRenderer.renderVideo(); } catch (FFmpegWriter.NoFFmpegException e) { LOGGER.error("Rendering video:", e); - NoticeScreen errorScreen = new NoticeScreen( + AlertScreen errorScreen = new AlertScreen( //#if MC>=11400 getScreen()::display, - new TranslatableText("replaymod.gui.rendering.error.title"), - new TranslatableText("replaymod.gui.rendering.error.message") + new TranslationTextComponent("replaymod.gui.rendering.error.title"), + new TranslationTextComponent("replaymod.gui.rendering.error.message") //#else //$$ I18n.format("replaymod.gui.rendering.error.title"), //$$ I18n.format("replaymod.gui.rendering.error.message") //#endif ); - getMinecraft().openScreen(errorScreen); + getMinecraft().displayGuiScreen(errorScreen); } catch (FFmpegWriter.FFmpegStartupException e) { GuiExportFailed.tryToRecover(e, newSettings -> { // Update settings with fixed ffmpeg arguments @@ -262,7 +262,7 @@ public void run() { renderButton.onClick(); }); } catch (Throwable t) { - error(LOGGER, GuiRenderSettings.this, CrashReport.create(t, "Rendering video"), () -> {}); + error(LOGGER, GuiRenderSettings.this, CrashReport.makeCrashReport(t, "Rendering video"), () -> {}); getScreen().display(); // Re-show the render settings gui and the new error popup } } diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderingDone.java b/src/main/java/com/replaymod/render/gui/GuiRenderingDone.java index 531b758b..4cc0e1cb 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderingDone.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderingDone.java @@ -48,7 +48,7 @@ public void run() { settingsRegistry.set(Setting.SKIP_POST_RENDER_GUI, true); settingsRegistry.save(); } - getMinecraft().openScreen(null); + getMinecraft().displayGuiScreen(null); } }).setSize(100, 20).setI18nLabel("replaymod.gui.close"); diff --git a/src/main/java/com/replaymod/render/gui/GuiVideoRenderer.java b/src/main/java/com/replaymod/render/gui/GuiVideoRenderer.java index 7fc8943a..f6b941ed 100644 --- a/src/main/java/com/replaymod/render/gui/GuiVideoRenderer.java +++ b/src/main/java/com/replaymod/render/gui/GuiVideoRenderer.java @@ -16,18 +16,18 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.texture.NativeImageBackedTexture; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.util.Identifier; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.client.resources.I18n; +import net.minecraft.util.ResourceLocation; //#if MC>=11400 -import net.minecraft.client.texture.NativeImage; +import net.minecraft.client.renderer.texture.NativeImage; //#endif import java.nio.ByteBuffer; public class GuiVideoRenderer extends GuiScreen implements Tickable { - private static final Identifier NO_PREVIEW_TEXTURE = new Identifier("replaymod", "logo.jpg"); + private static final ResourceLocation NO_PREVIEW_TEXTURE = new ResourceLocation("replaymod", "logo.jpg"); private final VideoRenderer renderer; @@ -85,7 +85,7 @@ public void onClick() { } }.setI18nLabel("replaymod.gui.rendering.cancel").setSize(150, 20); - private NativeImageBackedTexture previewTexture; + private DynamicTexture previewTexture; private boolean previewTextureDirty; { @@ -204,8 +204,8 @@ public void tick() { prevRenderedFrames = renderer.getFramesDone(); } - renderTime.setText(I18n.translate("replaymod.gui.rendering.timetaken") + ": " + secToString(renderTimeTaken/1000)); - remainingTime.setText(I18n.translate("replaymod.gui.rendering.timeleft") + ": " + secToString(renderTimeLeft)); + renderTime.setText(I18n.format("replaymod.gui.rendering.timetaken") + ": " + secToString(renderTimeTaken/1000)); + remainingTime.setText(I18n.format("replaymod.gui.rendering.timeleft") + ": " + secToString(renderTimeLeft)); int framesDone = renderer.getFramesDone(), framesTotal = renderer.getTotalFrames(); progressBar.setI18nLabel("replaymod.gui.rendering.progress", framesDone, framesTotal); @@ -218,9 +218,9 @@ private String secToString(int seconds) { int sec = seconds - ((min*60) + (hours*60*60)); StringBuilder builder = new StringBuilder(); - if(hours > 0) builder.append(hours).append(I18n.translate("replaymod.gui.hours")); - if(min > 0 || hours > 0) builder.append(min).append(I18n.translate("replaymod.gui.minutes")); - builder.append(sec).append(I18n.translate("replaymod.gui.seconds")); + if(hours > 0) builder.append(hours).append(I18n.format("replaymod.gui.hours")); + if(min > 0 || hours > 0) builder.append(min).append(I18n.format("replaymod.gui.minutes")); + builder.append(sec).append(I18n.format("replaymod.gui.seconds")); return builder.toString(); } @@ -232,18 +232,18 @@ private synchronized void renderPreview(GuiRenderer guiRenderer, ReadableDimensi if (previewTexture == null) { //#if MC>=11400 - previewTexture = new NativeImageBackedTexture(videoWidth, videoHeight, true); + previewTexture = new DynamicTexture(videoWidth, videoHeight, true); //#else //$$ previewTexture = new DynamicTexture(videoWidth, videoHeight); //#endif } if (previewTextureDirty) { - previewTexture.upload(); + previewTexture.updateDynamicTexture(); previewTextureDirty = false; } - guiRenderer.bindTexture(previewTexture.getGlId()); + guiRenderer.bindTexture(previewTexture.getGlTextureId()); renderPreviewTexture(guiRenderer, size, videoWidth, videoHeight); } @@ -269,7 +269,7 @@ public void updatePreview(ByteBuffer buffer, ReadableDimension size) { buffer.mark(); synchronized (this) { //#if MC>=11400 - NativeImage data = previewTexture.getImage(); + NativeImage data = previewTexture.getTextureData(); assert data != null; //#else //$$ int[] data = previewTexture.getTextureData(); @@ -286,7 +286,7 @@ public void updatePreview(ByteBuffer buffer, ReadableDimension size) { buffer.get(); // alpha //#if MC>=11400 int value = 0xff << 24 | b << 16 | g << 8 | r; - data.setPixelColor(x, y, value); // actually takes ABGR, not RGBA + data.setPixelRGBA(x, y, value); // actually takes ABGR, not RGBA //#else //$$ int value = 0xff << 24 | r << 16 | g << 8 | b; //$$ data[y * width + x] = value; diff --git a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java index aafd01f1..4729c7bc 100644 --- a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java +++ b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java @@ -7,10 +7,10 @@ import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.WorldRenderer; import com.replaymod.gui.utils.EventRegistrations; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; //#if MC>=11500 -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.matrix.MatrixStack; //#endif //#if MC>=11400 @@ -27,7 +27,7 @@ import java.io.IOException; public class EntityRendererHandler extends EventRegistrations implements WorldRenderer { - public final MinecraftClient mc = MCVer.getMinecraft(); + public final Minecraft mc = MCVer.getMinecraft(); protected final RenderSettings settings; diff --git a/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java b/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java index 14143698..3ac8ca65 100644 --- a/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java +++ b/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java @@ -1,6 +1,6 @@ package com.replaymod.render.hooks; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.renderer.WorldRenderer; public class ForceChunkLoadingHook { diff --git a/src/main/java/com/replaymod/render/hooks/IForceChunkLoading.java b/src/main/java/com/replaymod/render/hooks/IForceChunkLoading.java index 7c21c77e..9f085312 100644 --- a/src/main/java/com/replaymod/render/hooks/IForceChunkLoading.java +++ b/src/main/java/com/replaymod/render/hooks/IForceChunkLoading.java @@ -1,6 +1,6 @@ package com.replaymod.render.hooks; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.renderer.WorldRenderer; public interface IForceChunkLoading { void replayModRender_setHook(ForceChunkLoadingHook hook); diff --git a/src/main/java/com/replaymod/render/rendering/Pipeline.java b/src/main/java/com/replaymod/render/rendering/Pipeline.java index 20f8813d..ec33d8f2 100644 --- a/src/main/java/com/replaymod/render/rendering/Pipeline.java +++ b/src/main/java/com/replaymod/render/rendering/Pipeline.java @@ -5,9 +5,9 @@ import com.replaymod.render.capturer.WorldRenderer; import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.processor.GlToAbsoluteDepthProcessor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.util.crash.CrashException; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.client.Minecraft; +import net.minecraft.crash.ReportedException; +import net.minecraft.crash.CrashReport; import org.lwjgl.glfw.GLFW; import java.util.HashMap; @@ -38,7 +38,7 @@ public Pipeline(WorldRenderer worldRenderer, FrameCapturer capturer, FramePro this.consumer = consumer; float near = 0.05f; - float far = getMinecraft().options.viewDistance * 16 * 4; + float far = getMinecraft().gameSettings.renderDistanceChunks * 16 * 4; this.depthProcessor = new GlToAbsoluteDepthProcessor(near, far); } @@ -62,9 +62,9 @@ public boolean offer(Runnable runnable) { } }, new ThreadPoolExecutor.DiscardPolicy()); - MinecraftClient mc = MCVer.getMinecraft(); + Minecraft mc = MCVer.getMinecraft(); while (!capturer.isDone() && !abort) { - if (GLFW.glfwWindowShouldClose(mc.getWindow().getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) { + if (GLFW.glfwWindowShouldClose(mc.getMainWindow().getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) { processService.shutdown(); return; } @@ -87,8 +87,8 @@ public boolean offer(Runnable runnable) { processor.close(); consumer.close(); } catch (Throwable t) { - CrashReport crashReport = CrashReport.create(t, "Cleaning up rendering pipeline"); - throw new CrashException(crashReport); + CrashReport crashReport = CrashReport.makeCrashReport(t, "Cleaning up rendering pipeline"); + throw new ReportedException(crashReport); } } @@ -132,8 +132,8 @@ public void run() { consumerLock.notifyAll(); } } catch (Throwable t) { - CrashReport crashReport = CrashReport.create(t, "Processing frame"); - MCVer.getMinecraft().setCrashReport(crashReport); + CrashReport crashReport = CrashReport.makeCrashReport(t, "Processing frame"); + MCVer.getMinecraft().crashed(crashReport); } } } diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index d7bb6f89..33968df8 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -27,19 +27,19 @@ import com.replaymod.replaystudio.pathing.path.Timeline; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.sound.PositionedSoundInstance; -import net.minecraft.client.util.Window; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; -import net.minecraft.util.crash.CrashException; -import net.minecraft.sound.SoundCategory; -import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.shader.Framebuffer; +import net.minecraft.client.audio.SimpleSound; +import net.minecraft.client.MainWindow; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.ResourceLocation; +import net.minecraft.crash.ReportedException; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.Timer; import org.lwjgl.glfw.GLFW; //#if MC>=11600 -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.matrix.MatrixStack; //#endif //#if MC>=11500 @@ -77,8 +77,8 @@ import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; public class VideoRenderer implements RenderInfo { - private static final Identifier SOUND_RENDER_SUCCESS = new Identifier("replaymod", "render_success"); - private final MinecraftClient mc = MCVer.getMinecraft(); + private static final ResourceLocation SOUND_RENDER_SUCCESS = new ResourceLocation("replaymod", "render_success"); + private final Minecraft mc = MCVer.getMinecraft(); private final RenderSettings settings; private final ReplayHandler replayHandler; private final Timeline timeline; @@ -170,7 +170,7 @@ public boolean renderVideo() throws Throwable { // Because this might take some time to prepare we'll render the GUI at least once to not confuse the user drawGui(); - RenderTickCounter timer = ((MinecraftAccessor) mc).getTimer(); + Timer timer = ((MinecraftAccessor) mc).getTimer(); // Play up to one second before starting to render // This is necessary in order to ensure that all entities have at least two position packets @@ -185,7 +185,7 @@ public boolean renderVideo() throws Throwable { if (videoStart > 1000) { int replayTime = videoStart - 1000; //#if MC>=11200 - timer.tickDelta = 0; + timer.renderPartialTicks = 0; ((TimerAccessor) timer).setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK); //#else //$$ timer.elapsedPartialTicks = timer.renderPartialTicks = 0; @@ -209,7 +209,7 @@ public boolean renderVideo() throws Throwable { renderingPipeline.run(); if (((MinecraftAccessor) mc).getCrashReporter() != null) { - throw new CrashException(((MinecraftAccessor) mc).getCrashReporter()); + throw new ReportedException(((MinecraftAccessor) mc).getCrashReporter()); } if (settings.isInjectSphericalMetadata()) { @@ -232,7 +232,7 @@ public boolean renderVideo() throws Throwable { @Override public float updateForNextFrame() { // because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily - MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.getWindow(); + MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.getMainWindow(); int displayWidthBefore = acc.getFramebufferWidth(); int displayHeightBefore = acc.getFramebufferHeight(); acc.setFramebufferWidth(displayWidth); @@ -251,11 +251,11 @@ public float updateForNextFrame() { } // Updating the timer will cause the timeline player to update the game state - RenderTickCounter timer = ((MinecraftAccessor) mc).getTimer(); + Timer timer = ((MinecraftAccessor) mc).getTimer(); //#if MC>=11600 int elapsedTicks = //#endif - timer.beginRenderTick( + timer.getPartialTicks( //#if MC>=11400 MCVer.milliTime() //#endif @@ -281,11 +281,11 @@ public float updateForNextFrame() { acc.setFramebufferHeight(displayHeightBefore); if (cameraPathExporter != null) { - cameraPathExporter.recordFrame(timer.tickDelta); + cameraPathExporter.recordFrame(timer.renderPartialTicks); } framesDone++; - return timer.tickDelta; + return timer.renderPartialTicks; } @Override @@ -303,15 +303,15 @@ private void setup() { //$$ Display.setResizable(false); //$$ } //#endif - if (mc.options.debugEnabled) { + if (mc.gameSettings.showDebugInfo) { debugInfoWasShown = true; - mc.options.debugEnabled = false; + mc.gameSettings.showDebugInfo = false; } //#if MC>=11400 - if (mc.mouse.isCursorLocked()) { + if (mc.mouseHelper.isMouseGrabbed()) { mouseWasGrabbed = true; } - mc.mouse.unlockCursor(); + mc.mouseHelper.ungrabMouse(); //#else //$$ if (Mouse.isGrabbed()) { //$$ mouseWasGrabbed = true; @@ -323,8 +323,8 @@ private void setup() { originalSoundLevels = new EnumMap<>(SoundCategory.class); for (SoundCategory category : SoundCategory.values()) { if (category != SoundCategory.MASTER) { - originalSoundLevels.put(category, mc.options.getSoundVolume(category)); - mc.options.setSoundVolume(category, 0); + originalSoundLevels.put(category, mc.gameSettings.getSoundLevel(category)); + mc.gameSettings.setSoundLevel(category, 0); } } @@ -351,7 +351,7 @@ private void setup() { updateDisplaySize(); - gui.toMinecraft().init(mc, mc.getWindow().getScaledWidth(), mc.getWindow().getScaledHeight()); + gui.toMinecraft().init(mc, mc.getMainWindow().getScaledWidth(), mc.getMainWindow().getScaledHeight()); forceChunkLoadingHook = new ForceChunkLoadingHook(mc.worldRenderer); @@ -376,18 +376,18 @@ private void finish() { //$$ Display.setResizable(true); //$$ } //#endif - mc.options.debugEnabled = debugInfoWasShown; + mc.gameSettings.showDebugInfo = debugInfoWasShown; if (mouseWasGrabbed) { //#if MC>=11400 - mc.mouse.lockCursor(); + mc.mouseHelper.grabMouse(); //#else //$$ mc.mouseHelper.grabMouseCursor(); //#endif } for (Map.Entry entry : originalSoundLevels.entrySet()) { - mc.options.setSoundVolume(entry.getKey(), entry.getValue()); + mc.gameSettings.setSoundLevel(entry.getKey(), entry.getValue()); } - mc.openScreen(null); + mc.displayGuiScreen(null); forceChunkLoadingHook.uninstall(); if (!hasFailed() && cameraPathExporter != null) { @@ -398,7 +398,7 @@ private void finish() { } } - mc.getSoundManager().play(PositionedSoundInstance.master(new SoundEvent(SOUND_RENDER_SUCCESS), 1)); + mc.getSoundHandler().play(SimpleSound.master(new SoundEvent(SOUND_RENDER_SUCCESS), 1)); try { if (!hasFailed() && ffmpegWriter != null) { @@ -415,7 +415,7 @@ private void finish() { private void executeTaskQueue() { //#if MC>=11400 while (true) { - while (mc.overlay != null) { + while (mc.loadingGui != null) { drawGui(); ((MinecraftMethodAccessor) mc).replayModExecuteTaskQueue(); } @@ -456,12 +456,12 @@ private void tick() { //$$ throw new RuntimeException(e); //$$ } //#else - mc.tick(); + mc.runTick(); //#endif } public boolean drawGui() { - Window window = mc.getWindow(); + MainWindow window = mc.getMainWindow(); do { if (GLFW.glfwWindowShouldClose(window.getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) { return false; @@ -488,13 +488,13 @@ public boolean drawGui() { //#endif ); enableTexture(); - guiFramebuffer.beginWrite(true); + guiFramebuffer.bindFramebuffer(true); //#if MC>=11500 - RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC); + RenderSystem.clear(256, Minecraft.IS_RUNNING_ON_MAC); RenderSystem.matrixMode(GL11.GL_PROJECTION); RenderSystem.loadIdentity(); - RenderSystem.ortho(0, window.getFramebufferWidth() / window.getScaleFactor(), window.getFramebufferHeight() / window.getScaleFactor(), 0, 1000, 3000); + RenderSystem.ortho(0, window.getFramebufferWidth() / window.getGuiScaleFactor(), window.getFramebufferHeight() / window.getGuiScaleFactor(), 0, 1000, 3000); RenderSystem.matrixMode(GL11.GL_MODELVIEW); RenderSystem.loadIdentity(); RenderSystem.translatef(0, 0, -2000); @@ -528,14 +528,14 @@ public boolean drawGui() { //#endif //#if MC>=11400 - int mouseX = (int) mc.mouse.getX() * window.getScaledWidth() / displayWidth; - int mouseY = (int) mc.mouse.getY() * window.getScaledHeight() / displayHeight; + int mouseX = (int) mc.mouseHelper.getMouseX() * window.getScaledWidth() / displayWidth; + int mouseY = (int) mc.mouseHelper.getMouseY() * window.getScaledHeight() / displayHeight; - if (mc.overlay != null) { + if (mc.loadingGui != null) { Screen orgScreen = mc.currentScreen; try { mc.currentScreen = gui.toMinecraft(); - mc.overlay.render( + mc.loadingGui.render( //#if MC>=11600 new MatrixStack(), //#endif @@ -559,14 +559,14 @@ public boolean drawGui() { //$$ gui.toMinecraft().drawScreen(mouseX, mouseY, 0); //#endif - guiFramebuffer.endWrite(); + guiFramebuffer.unbindFramebuffer(); popMatrix(); pushMatrix(); - guiFramebuffer.draw(displayWidth, displayHeight); + guiFramebuffer.framebufferRender(displayWidth, displayHeight); popMatrix(); //#if MC>=11500 - window.swapBuffers(); + window.flipFrame(); //#else //#if MC>=11400 //$$ window.setFullscreen(false); @@ -585,8 +585,8 @@ public boolean drawGui() { //#endif //#endif //#if MC>=11400 - if (mc.mouse.isCursorLocked()) { - mc.mouse.unlockCursor(); + if (mc.mouseHelper.isMouseGrabbed()) { + mc.mouseHelper.ungrabMouse(); } //#else //$$ if (Mouse.isGrabbed()) { @@ -599,8 +599,8 @@ public boolean drawGui() { } private boolean displaySizeChanged() { - int realWidth = mc.getWindow().getWidth(); - int realHeight = mc.getWindow().getHeight(); + int realWidth = mc.getMainWindow().getWidth(); + int realHeight = mc.getMainWindow().getHeight(); if (realWidth == 0 || realHeight == 0) { // These can be zero on Windows if minimized. // Creating zero-sized framebuffers however will throw an error, so we never want to switch to zero values. @@ -610,8 +610,8 @@ private boolean displaySizeChanged() { } private void updateDisplaySize() { - displayWidth = mc.getWindow().getWidth(); - displayHeight = mc.getWindow().getHeight(); + displayWidth = mc.getMainWindow().getWidth(); + displayHeight = mc.getMainWindow().getHeight(); } public int getFramesDone() { @@ -672,13 +672,13 @@ public long getTimePassed() { public static String[] checkCompat() { //#if FABRIC>=1 - if (net.fabricmc.loader.api.FabricLoader.getInstance().isModLoaded("sodium")) { - return new String[] { - "Rendering is not currently supported while Sodium is installed.", - "See https://github.com/ReplayMod/ReplayMod/issues/150", - "For now, you need to uninstall Sodium before rendering!" - }; - } + //$$ if (net.fabricmc.loader.api.FabricLoader.getInstance().isModLoaded("sodium")) { + //$$ return new String[] { + //$$ "Rendering is not currently supported while Sodium is installed.", + //$$ "See https://github.com/ReplayMod/ReplayMod/issues/150", + //$$ "For now, you need to uninstall Sodium before rendering!" + //$$ }; + //$$ } //#endif return null; } diff --git a/src/main/java/com/replaymod/render/shader/Program.java b/src/main/java/com/replaymod/render/shader/Program.java index 0c6ec6ea..e48900d7 100644 --- a/src/main/java/com/replaymod/render/shader/Program.java +++ b/src/main/java/com/replaymod/render/shader/Program.java @@ -1,7 +1,7 @@ package com.replaymod.render.shader; import com.replaymod.core.versions.MCVer; -import net.minecraft.util.Identifier; +import net.minecraft.util.ResourceLocation; import org.apache.commons.io.IOUtils; import org.lwjgl.opengl.ARBFragmentShader; import org.lwjgl.opengl.ARBShaderObjects; @@ -9,7 +9,7 @@ import org.lwjgl.opengl.GL11; //#if MC>=11400 -import net.minecraft.resource.Resource; +import net.minecraft.resources.IResource; //#else //$$ import net.minecraft.client.resources.IResource; //#endif @@ -21,7 +21,7 @@ public class Program { private final int program; - public Program(Identifier vertexShader, Identifier fragmentShader) throws Exception { + public Program(ResourceLocation vertexShader, ResourceLocation fragmentShader) throws Exception { int vertShader = createShader(vertexShader, ARBVertexShader.GL_VERTEX_SHADER_ARB); int fragShader = createShader(fragmentShader, ARBFragmentShader.GL_FRAGMENT_SHADER_ARB); @@ -44,7 +44,7 @@ public Program(Identifier vertexShader, Identifier fragmentShader) throws Except } } - private int createShader(Identifier resourceLocation, int shaderType) throws Exception { + private int createShader(ResourceLocation resourceLocation, int shaderType) throws Exception { int shader = 0; try { shader = glCreateShaderObjectARB(shaderType); @@ -52,7 +52,7 @@ private int createShader(Identifier resourceLocation, int shaderType) throws Exc if(shader == 0) throw new Exception("glCreateShaderObjectARB failed"); - Resource resource = MCVer.getMinecraft().getResourceManager().getResource(resourceLocation); + IResource resource = MCVer.getMinecraft().getResourceManager().getResource(resourceLocation); try (InputStream is = resource.getInputStream()) { glShaderSourceARB(shader, IOUtils.toString(is)); } diff --git a/src/main/java/com/replaymod/replay/FullReplaySender.java b/src/main/java/com/replaymod/replay/FullReplaySender.java index 69ad17a3..330c3b3a 100644 --- a/src/main/java/com/replaymod/replay/FullReplaySender.java +++ b/src/main/java/com/replaymod/replay/FullReplaySender.java @@ -19,41 +19,41 @@ import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.OtherClientPlayerEntity; -import net.minecraft.client.gui.screen.DownloadingTerrainScreen; -import net.minecraft.client.gui.screen.NoticeScreen; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.RemoteClientPlayerEntity; +import net.minecraft.client.gui.screen.DownloadTerrainScreen; +import net.minecraft.client.gui.screen.AlertScreen; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.NetworkState; -import net.minecraft.network.Packet; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; -import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; -import net.minecraft.network.packet.s2c.play.EntitiesDestroyS2CPacket; -import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; -import net.minecraft.network.packet.s2c.play.ExperienceBarUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.ExperienceOrbSpawnS2CPacket; -import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket; -import net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket; -import net.minecraft.network.packet.s2c.play.CloseScreenS2CPacket; -import net.minecraft.network.packet.s2c.play.OpenHorseScreenS2CPacket; -import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.ScreenHandlerPropertyUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket; -import net.minecraft.network.packet.s2c.login.LoginSuccessS2CPacket; -import net.minecraft.network.packet.s2c.play.MobSpawnS2CPacket; -import net.minecraft.network.packet.s2c.play.PaintingSpawnS2CPacket; -import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerAbilitiesS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerSpawnS2CPacket; -import net.minecraft.network.packet.s2c.play.SignEditorOpenS2CPacket; -import net.minecraft.network.packet.s2c.play.StatisticsS2CPacket; -import net.minecraft.text.Text; +import net.minecraft.network.ProtocolType; +import net.minecraft.network.IPacket; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.server.SChatPacket; +import net.minecraft.network.play.server.SCustomPayloadPlayPacket; +import net.minecraft.network.play.server.SDisconnectPacket; +import net.minecraft.network.play.server.SDestroyEntitiesPacket; +import net.minecraft.network.play.server.SSpawnObjectPacket; +import net.minecraft.network.play.server.SSetExperiencePacket; +import net.minecraft.network.play.server.SSpawnExperienceOrbPacket; +import net.minecraft.network.play.server.SJoinGamePacket; +import net.minecraft.network.play.server.SChangeGameStatePacket; +import net.minecraft.network.play.server.SCloseWindowPacket; +import net.minecraft.network.play.server.SOpenHorseWindowPacket; +import net.minecraft.network.play.server.SSetSlotPacket; +import net.minecraft.network.play.server.SWindowPropertyPacket; +import net.minecraft.network.play.server.SUpdateHealthPacket; +import net.minecraft.network.login.server.SLoginSuccessPacket; +import net.minecraft.network.play.server.SSpawnMobPacket; +import net.minecraft.network.play.server.SSpawnPaintingPacket; +import net.minecraft.network.play.server.SSpawnParticlePacket; +import net.minecraft.network.play.server.SPlayerAbilitiesPacket; +import net.minecraft.network.play.server.SPlayerPositionLookPacket; +import net.minecraft.network.play.server.SRespawnPacket; +import net.minecraft.network.play.server.SSpawnPlayerPacket; +import net.minecraft.network.play.server.SOpenSignMenuPacket; +import net.minecraft.network.play.server.SStatisticsPacket; +import net.minecraft.util.text.ITextComponent; import net.minecraft.util.math.MathHelper; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -64,15 +64,15 @@ //#endif //#if MC>=11400 -import net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket; -import net.minecraft.network.packet.s2c.play.OpenScreenS2CPacket; -import net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket; +import net.minecraft.network.play.server.SChunkDataPacket; +import net.minecraft.network.play.server.SPlayerDiggingPacket; +import net.minecraft.network.play.server.SOpenWindowPacket; +import net.minecraft.network.play.server.SOpenBookWindowPacket; import net.minecraft.entity.EntityType; -import net.minecraft.text.TranslatableText; -import net.minecraft.world.chunk.ChunkManager; -import net.minecraft.world.chunk.WorldChunk; -import net.minecraft.world.chunk.light.LightingProvider; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.chunk.AbstractChunkProvider; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.lighting.WorldLightManager; //#else //$$ import net.minecraft.client.resources.I18n; //$$ import net.minecraft.world.EnumDifficulty; @@ -84,7 +84,7 @@ //#endif //#if MC>=11400 -import net.minecraft.util.Identifier; +import net.minecraft.util.ResourceLocation; //#if MC<11400 //$$ import net.minecraft.world.dimension.DimensionType; //#endif @@ -92,27 +92,27 @@ //#if MC>=11200 import com.replaymod.core.utils.WrappedTimer; -import net.minecraft.network.packet.s2c.play.AdvancementUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.SelectAdvancementTabS2CPacket; -import net.minecraft.network.packet.s2c.play.SynchronizeRecipesS2CPacket; +import net.minecraft.network.play.server.SAdvancementInfoPacket; +import net.minecraft.network.play.server.SSelectAdvancementsTabPacket; +import net.minecraft.network.play.server.SUpdateRecipesPacket; //#endif //#if MC>=11002 -import net.minecraft.world.GameMode; +import net.minecraft.world.GameType; //#else //$$ import net.minecraft.world.WorldSettings.GameType; //#endif //#if MC>=10904 -import net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket; +import net.minecraft.network.play.server.SUnloadChunkPacket; //#else //$$ import net.minecraft.network.play.server.S21PacketChunkData; //#endif //#if MC>=10800 -import net.minecraft.network.packet.s2c.play.ResourcePackSendS2CPacket; -import net.minecraft.network.packet.s2c.play.SetCameraEntityS2CPacket; -import net.minecraft.network.packet.s2c.play.TitleS2CPacket; -import net.minecraft.network.NetworkSide; +import net.minecraft.network.play.server.SSendResourcePackPacket; +import net.minecraft.network.play.server.SCameraPacket; +import net.minecraft.network.play.server.STitlePacket; +import net.minecraft.network.PacketDirection; //#else //$$ import org.apache.commons.io.Charsets; //#endif @@ -139,30 +139,30 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend */ private static final List BAD_PACKETS = Arrays.asList( //#if MC>=11404 - PlayerActionResponseS2CPacket.class, + SPlayerDiggingPacket.class, //#endif //#if MC>=11400 - OpenWrittenBookS2CPacket.class, - OpenScreenS2CPacket.class, + SOpenBookWindowPacket.class, + SOpenWindowPacket.class, //#endif //#if MC>=11200 - SynchronizeRecipesS2CPacket.class, - AdvancementUpdateS2CPacket.class, - SelectAdvancementTabS2CPacket.class, + SUpdateRecipesPacket.class, + SAdvancementInfoPacket.class, + SSelectAdvancementsTabPacket.class, //#endif //#if MC>=10800 - SetCameraEntityS2CPacket.class, - TitleS2CPacket.class, + SCameraPacket.class, + STitlePacket.class, //#endif - HealthUpdateS2CPacket.class, - OpenHorseScreenS2CPacket.class, - CloseScreenS2CPacket.class, - ScreenHandlerSlotUpdateS2CPacket.class, - ScreenHandlerPropertyUpdateS2CPacket.class, - SignEditorOpenS2CPacket.class, - StatisticsS2CPacket.class, - ExperienceBarUpdateS2CPacket.class, - PlayerAbilitiesS2CPacket.class + SUpdateHealthPacket.class, + SOpenHorseWindowPacket.class, + SCloseWindowPacket.class, + SSetSlotPacket.class, + SWindowPropertyPacket.class, + SOpenSignMenuPacket.class, + SStatisticsPacket.class, + SSetExperiencePacket.class, + SPlayerAbilitiesPacket.class ); private static int TP_DISTANCE_LIMIT = 128; @@ -243,7 +243,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend /** * The minecraft instance. */ - protected MinecraftClient mc = getMinecraft(); + protected Minecraft mc = getMinecraft(); /** * The total length of this replay in milliseconds. @@ -367,8 +367,8 @@ private void onWorldTick() { // to any chunk yet. if (mc.world != null) { for (PlayerEntity playerEntity : mc.world.getPlayers()) { - if (!playerEntity.updateNeeded && playerEntity instanceof OtherClientPlayerEntity) { - playerEntity.tickMovement(); + if (!playerEntity.addedToChunk && playerEntity instanceof RemoteClientPlayerEntity) { + playerEntity.livingTick(); } } } @@ -384,20 +384,20 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) } // When a packet is sent directly, perform no filtering - if(msg instanceof Packet) { + if(msg instanceof IPacket) { super.channelRead(ctx, msg); } if (msg instanceof byte[]) { try { - Packet deserialized = deserializePacket((byte[]) msg); + IPacket deserialized = deserializePacket((byte[]) msg); if (deserialized == null) { System.out.println("Failed to deserialize a packet to send. loginPhase: " + loginPhase); return; } - Packet processed = processPacket(deserialized); + IPacket processed = processPacket(deserialized); if (processed != null) { // System.out.println("Processing a packet. Class: " + processed.getClass().toString()); @@ -408,19 +408,19 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) // 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.world != null) { - if (processed instanceof PlayerSpawnS2CPacket - || processed instanceof EntitySpawnS2CPacket - || processed instanceof MobSpawnS2CPacket + if (processed instanceof SSpawnPlayerPacket + || processed instanceof SSpawnObjectPacket + || processed instanceof SSpawnMobPacket //#if MC<11600 //$$ || processed instanceof EntitySpawnGlobalS2CPacket //#endif - || processed instanceof PaintingSpawnS2CPacket - || processed instanceof ExperienceOrbSpawnS2CPacket - || processed instanceof EntitiesDestroyS2CPacket) { + || processed instanceof SSpawnPaintingPacket + || processed instanceof SSpawnExperienceOrbPacket + || processed instanceof SDestroyEntitiesPacket) { ClientWorld world = mc.world; //#if MC>=11400 // Note: Not sure if it's still required but there's this really handy method anyway - world.finishRemovingEntities(); + world.removeAllEntities(); //#else //$$ Iterator iter = world.loadedEntityList.iterator(); //$$ while (iter.hasNext()) { @@ -451,19 +451,19 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) } //#if MC>=11400 - if (processed instanceof ChunkDataS2CPacket) { + if (processed instanceof SChunkDataPacket) { Runnable doLightUpdates = () -> { if (mc.world != null) { - LightingProvider provider = mc.world.getChunkManager().getLightingProvider(); - while (provider.hasUpdates()) { - provider.doLightUpdates(Integer.MAX_VALUE, true, true); + WorldLightManager provider = mc.world.getChunkProvider().getLightManager(); + while (provider.hasLightWork()) { + provider.tick(Integer.MAX_VALUE, true, true); } } }; - if (mc.isOnThread()) { + if (mc.isOnExecutionThread()) { doLightUpdates.run(); } else { - mc.send(doLightUpdates); + mc.enqueue(doLightUpdates); } } //#endif @@ -475,20 +475,20 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) } - private Packet deserializePacket(byte[] bytes) { + private IPacket deserializePacket(byte[] bytes) { try { ByteBuf bb = Unpooled.wrappedBuffer(bytes); - PacketByteBuf pb = new PacketByteBuf(bb); + PacketBuffer pb = new PacketBuffer(bb); int i = pb.readVarInt(); - NetworkState state = loginPhase ? NetworkState.LOGIN : NetworkState.PLAY; + ProtocolType state = loginPhase ? ProtocolType.LOGIN : ProtocolType.PLAY; //#if MC>=10800 - Packet p = state.getPacketHandler(NetworkSide.CLIENTBOUND, i); + IPacket p = state.getPacket(PacketDirection.CLIENTBOUND, i); //#else //$$ Packet p = Packet.generatePacket(state.func_150755_b(), i); //#endif - p.read(pb); + p.readPacketData(pb); return p; } catch (Exception e) { @@ -502,15 +502,15 @@ private Packet deserializePacket(byte[] bytes) { * @param p The packet to process * @return The processed packet or {@code null} if no packet shall be sent */ - protected Packet processPacket(Packet p) throws Exception { - if (p instanceof LoginSuccessS2CPacket) { + protected IPacket processPacket(IPacket p) throws Exception { + if (p instanceof SLoginSuccessPacket) { loginPhase = false; return p; } - if (p instanceof CustomPayloadS2CPacket) { - CustomPayloadS2CPacket packet = (CustomPayloadS2CPacket) p; - if (Restrictions.PLUGIN_CHANNEL.equals(packet.getChannel())) { + if (p instanceof SCustomPayloadPlayPacket) { + SCustomPayloadPlayPacket packet = (SCustomPayloadPlayPacket) p; + if (Restrictions.PLUGIN_CHANNEL.equals(packet.getChannelName())) { final String unknown = replayHandler.getRestrictions().handle(packet); if (unknown == null) { return null; @@ -524,11 +524,11 @@ protected Packet processPacket(Packet p) throws Exception { } catch (IOException e) { e.printStackTrace(); } - mc.openScreen(new NoticeScreen( + mc.displayGuiScreen(new AlertScreen( //#if MC>=11400 - () -> mc.openScreen(null), - new TranslatableText("replaymod.error.unknownrestriction1"), - new TranslatableText("replaymod.error.unknownrestriction2", unknown) + () -> mc.displayGuiScreen(null), + new TranslationTextComponent("replaymod.error.unknownrestriction1"), + new TranslationTextComponent("replaymod.error.unknownrestriction2", unknown) //#else //$$ I18n.format("replaymod.error.unknownrestriction1"), //$$ I18n.format("replaymod.error.unknownrestriction2", unknown) @@ -538,8 +538,8 @@ protected Packet processPacket(Packet p) throws Exception { } } } - if (p instanceof DisconnectS2CPacket) { - Text reason = ((DisconnectS2CPacket) p).getReason(); + if (p instanceof SDisconnectPacket) { + ITextComponent reason = ((SDisconnectPacket) p).getReason(); String message = reason.getString(); if ("Please update to view this replay.".equals(message)) { // This version of the mod supports replay restrictions so we are allowed @@ -550,10 +550,10 @@ protected Packet processPacket(Packet p) throws Exception { if(BAD_PACKETS.contains(p.getClass())) return null; - if (p instanceof CustomPayloadS2CPacket) { - CustomPayloadS2CPacket packet = (CustomPayloadS2CPacket) p; + if (p instanceof SCustomPayloadPlayPacket) { + SCustomPayloadPlayPacket packet = (SCustomPayloadPlayPacket) p; //#if MC>=11400 - Identifier channelName = packet.getChannel(); + ResourceLocation channelName = packet.getChannelName(); //#else //$$ String channelName = packet.getChannelName(); //#endif @@ -570,8 +570,8 @@ protected Packet processPacket(Packet p) throws Exception { //#if MC>=10800 } - if(p instanceof ResourcePackSendS2CPacket) { - ResourcePackSendS2CPacket packet = (ResourcePackSendS2CPacket) p; + if(p instanceof SSendResourcePackPacket) { + SSendResourcePackPacket packet = (SSendResourcePackPacket) p; String url = packet.getURL(); if (url.startsWith("replay://")) { //#else @@ -595,34 +595,34 @@ protected Packet processPacket(Packet p) throws Exception { } } - if(p instanceof GameJoinS2CPacket) { - GameJoinS2CPacket packet = (GameJoinS2CPacket) p; - int entId = packet.getEntityId(); + if(p instanceof SJoinGamePacket) { + SJoinGamePacket packet = (SJoinGamePacket) p; + int entId = packet.getPlayerId(); allowMovement = true; actualID = entId; entId = -1789435; // Camera entity id should be negative which is an invalid id and can't be used by servers //#if MC>=11400 - p = new GameJoinS2CPacket( + p = new SJoinGamePacket( entId, - GameMode.SPECTATOR, + GameType.SPECTATOR, //#if MC>=11600 - GameMode.SPECTATOR, + GameType.SPECTATOR, //#endif //#if MC>=11500 - packet.getSha256Seed(), + packet.getHashedSeed(), //#endif false, //#if MC>=11600 //#if MC>=11603 - packet.getDimensionIds(), - (net.minecraft.util.registry.DynamicRegistryManager.Impl) packet.getRegistryManager(), - packet.getDimensionType(), + packet.getDimensionKeys(), + (net.minecraft.util.registry.DynamicRegistries.Impl) packet.getDynamicRegistries(), + packet.getSpawnDimension(), //#else //$$ packet.method_29443(), //$$ (net.minecraft.util.registry.RegistryTracker.Modifiable) packet.getDimension(), //$$ packet.method_29444(), //#endif - packet.getDimensionId(), + packet.getDimension(), //#else //$$ packet.getDimension(), //#endif @@ -631,12 +631,12 @@ protected Packet processPacket(Packet p) throws Exception { //$$ packet.getGeneratorType(), //#endif packet.getViewDistance(), - packet.hasReducedDebugInfo() + packet.isReducedDebugInfo() //#if MC>=11500 - , packet.showsDeathScreen() + , packet.shouldEnableRespawnScreen() //#endif //#if MC>=11600 - , packet.isDebugWorld() + , packet.func_240820_n_() , packet.isFlatWorld() //#endif ); @@ -674,23 +674,23 @@ protected Packet processPacket(Packet p) throws Exception { //#endif } - if(p instanceof PlayerRespawnS2CPacket) { - PlayerRespawnS2CPacket respawn = (PlayerRespawnS2CPacket) p; + if(p instanceof SRespawnPacket) { + SRespawnPacket respawn = (SRespawnPacket) p; //#if MC>=11400 - p = new PlayerRespawnS2CPacket( + p = new SRespawnPacket( //#if MC>=11600 - respawn.method_29445(), + respawn.func_244303_b(), //#endif - respawn.getDimension(), + respawn.func_240827_c_(), //#if MC>=11500 - respawn.getSha256Seed(), + respawn.getHashedSeed(), //#endif //#if MC>=11600 - GameMode.SPECTATOR, - GameMode.SPECTATOR, - respawn.isDebugWorld(), + GameType.SPECTATOR, + GameType.SPECTATOR, + respawn.func_240828_f_(), respawn.isFlatWorld(), - respawn.isWritingErrorSkippable() + respawn.shouldSkipErrors() //#else //$$ respawn.getGeneratorType(), //$$ GameMode.SPECTATOR @@ -714,14 +714,14 @@ protected Packet processPacket(Packet p) throws Exception { allowMovement = true; } - if(p instanceof PlayerPositionLookS2CPacket) { - final PlayerPositionLookS2CPacket ppl = (PlayerPositionLookS2CPacket) p; + if(p instanceof SPlayerPositionLookPacket) { + final SPlayerPositionLookPacket ppl = (SPlayerPositionLookPacket) p; if(!hasWorldLoaded) hasWorldLoaded = true; ReplayMod.instance.runLater(() -> { - if (mc.currentScreen instanceof DownloadingTerrainScreen) { + if (mc.currentScreen instanceof DownloadTerrainScreen) { // Close the world loading screen manually in case we swallow the packet - mc.openScreen(null); + mc.displayGuiScreen(null); } }); @@ -731,10 +731,10 @@ protected Packet processPacket(Packet p) throws Exception { //#if MC>=10800 //#if MC>=11400 - for (PlayerPositionLookS2CPacket.Flag relative : ppl.getFlags()) { - if (relative == PlayerPositionLookS2CPacket.Flag.X - || relative == PlayerPositionLookS2CPacket.Flag.Y - || relative == PlayerPositionLookS2CPacket.Flag.Z) { + for (SPlayerPositionLookPacket.Flags relative : ppl.getFlags()) { + if (relative == SPlayerPositionLookPacket.Flags.X + || relative == SPlayerPositionLookPacket.Flags.Y + || relative == SPlayerPositionLookPacket.Flags.Z) { //#else //#if MC>=10904 //$$ for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) { @@ -751,8 +751,8 @@ protected Packet processPacket(Packet p) throws Exception { //#endif if(cent != null) { - if(!allowMovement && !((Math.abs(cent.getX() - ppl.getX()) > TP_DISTANCE_LIMIT) || - (Math.abs(cent.getZ() - ppl.getZ()) > TP_DISTANCE_LIMIT))) { + if(!allowMovement && !((Math.abs(cent.getPosX() - ppl.getX()) > TP_DISTANCE_LIMIT) || + (Math.abs(cent.getPosZ() - ppl.getZ()) > TP_DISTANCE_LIMIT))) { return null; } else { allowMovement = false; @@ -763,7 +763,7 @@ protected Packet processPacket(Packet p) throws Exception { @Override @SuppressWarnings("unchecked") public void run() { - if (mc.world == null || !mc.isOnThread()) { + if (mc.world == null || !mc.isOnExecutionThread()) { ReplayMod.instance.runLater(this); return; } @@ -774,8 +774,8 @@ public void run() { }.run(); } - if(p instanceof GameStateChangeS2CPacket) { - GameStateChangeS2CPacket pg = (GameStateChangeS2CPacket)p; + if(p instanceof SChangeGameStatePacket) { + SChangeGameStatePacket pg = (SChangeGameStatePacket)p; // only allow the following packets: // 1 - End raining // 2 - Begin raining @@ -785,22 +785,22 @@ public void run() { // 8 - Fade time if (!Arrays.asList( //#if MC>=11600 - GameStateChangeS2CPacket.RAIN_STARTED, - GameStateChangeS2CPacket.RAIN_STOPPED, - GameStateChangeS2CPacket.RAIN_GRADIENT_CHANGED, - GameStateChangeS2CPacket.THUNDER_GRADIENT_CHANGED + SChangeGameStatePacket.RAINING, + SChangeGameStatePacket.CLEAR, + SChangeGameStatePacket.SET_RAIN_STRENGTH, + SChangeGameStatePacket.SET_THUNDER_STRENGTH //#else //$$ 1, //$$ 2, //$$ 7, //$$ 8 //#endif - ).contains(pg.getReason())) { + ).contains(pg.getState())) { return null; } } - if (p instanceof GameMessageS2CPacket) { + if (p instanceof SChatPacket) { if (!ReplayModReplay.instance.getCore().getSettingsRegistry().get(Setting.SHOW_CHAT)) { return null; } @@ -1043,15 +1043,15 @@ public void jumpToTime(int millis) { desiredTimeStamp = millis; } - protected Packet processPacketAsync(Packet p) { + protected IPacket processPacketAsync(IPacket p) { //If hurrying, ignore some packets, except for short durations if(desiredTimeStamp - lastTimeStamp > 1000) { - if(p instanceof ParticleS2CPacket) return null; + if(p instanceof SSpawnParticlePacket) return null; - if(p instanceof EntitySpawnS2CPacket) { - EntitySpawnS2CPacket pso = (EntitySpawnS2CPacket)p; + if(p instanceof SSpawnObjectPacket) { + SSpawnObjectPacket pso = (SSpawnObjectPacket)p; //#if MC>=11400 - if (pso.getEntityTypeId() == EntityType.FIREWORK_ROCKET) return null; + if (pso.getType() == EntityType.FIREWORK_ROCKET) return null; //#else //$$ int type = pso.getType(); //$$ if(type == 76) { // Firework rocket @@ -1141,10 +1141,10 @@ public void sendPacketsTill(int timestamp) { } } - protected Packet processPacketSync(Packet p) { + protected IPacket processPacketSync(IPacket p) { //#if MC>=10904 - if (p instanceof UnloadChunkS2CPacket) { - UnloadChunkS2CPacket packet = (UnloadChunkS2CPacket) p; + if (p instanceof SUnloadChunkPacket) { + SUnloadChunkPacket packet = (SUnloadChunkPacket) p; int x = packet.getX(); int z = packet.getZ(); //#else @@ -1165,8 +1165,8 @@ protected Packet processPacketSync(Packet p) { // Get the chunk that will be unloaded //#if MC>=11400 ClientWorld world = mc.world; - ChunkManager chunkProvider = world.getChunkManager(); - WorldChunk chunk = chunkProvider.getWorldChunk(x, z + AbstractChunkProvider chunkProvider = world.getChunkProvider(); + Chunk chunk = chunkProvider.getChunkNow(x, z //#if MC<11500 //$$ , false //#endif @@ -1180,7 +1180,7 @@ protected Packet processPacketSync(Packet p) { //#endif List entitiesInChunk = new ArrayList<>(); // Gather all entities in that chunk - for (Collection entityList : chunk.getEntitySectionArray()) { + for (Collection entityList : chunk.getEntityLists()) { entitiesInChunk.addAll(entityList); } for (Entity entity : entitiesInChunk) { @@ -1198,15 +1198,15 @@ protected Packet processPacketSync(Packet p) { // Check whether the entity has left the chunk //#if MC>=11404 - int chunkX = MathHelper.floor(entity.getX() / 16); - int chunkY = MathHelper.floor(entity.getY() / 16); - int chunkZ = MathHelper.floor(entity.getZ() / 16); - if (entity.chunkX != chunkX || entity.chunkY != chunkY || entity.chunkZ != chunkZ) { - if (entity.updateNeeded) { + int chunkX = MathHelper.floor(entity.getPosX() / 16); + int chunkY = MathHelper.floor(entity.getPosY() / 16); + int chunkZ = MathHelper.floor(entity.getPosZ() / 16); + if (entity.chunkCoordX != chunkX || entity.chunkCoordY != chunkY || entity.chunkCoordZ != chunkZ) { + if (entity.addedToChunk) { // Entity has left the chunk - chunk.remove(entity, entity.chunkY); + chunk.removeEntityAtIndex(entity, entity.chunkCoordY); } - WorldChunk newChunk = chunkProvider.getWorldChunk(chunkX, chunkZ + Chunk newChunk = chunkProvider.getChunkNow(chunkX, chunkZ //#if MC<11500 //$$ , false //#endif @@ -1215,7 +1215,7 @@ protected Packet processPacketSync(Packet p) { newChunk.addEntity(entity); } else { // Entity has left all loaded chunks - entity.updateNeeded = false; + entity.addedToChunk = false; } } //#else diff --git a/src/main/java/com/replaymod/replay/InputReplayTimer.java b/src/main/java/com/replaymod/replay/InputReplayTimer.java index 394fdd50..445b2a03 100644 --- a/src/main/java/com/replaymod/replay/InputReplayTimer.java +++ b/src/main/java/com/replaymod/replay/InputReplayTimer.java @@ -5,8 +5,8 @@ import com.replaymod.core.versions.MCVer; import com.replaymod.replay.camera.CameraController; import com.replaymod.replay.camera.CameraEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Timer; //#if MC>=11400 import org.lwjgl.glfw.GLFW; @@ -30,9 +30,9 @@ public class InputReplayTimer extends WrappedTimer { private final ReplayModReplay mod; - private final MinecraftClient mc; + private final Minecraft mc; - public InputReplayTimer(RenderTickCounter wrapped, ReplayModReplay mod) { + public InputReplayTimer(Timer wrapped, ReplayModReplay mod) { super(wrapped); this.mod = mod; this.mc = mod.getCore().getMinecraft(); @@ -45,7 +45,7 @@ public InputReplayTimer(RenderTickCounter wrapped, ReplayModReplay mod) { //#else //$$ void //#endif - beginRenderTick( + getPartialTicks( //#if MC>=11400 long sysClock //#endif @@ -53,7 +53,7 @@ public InputReplayTimer(RenderTickCounter wrapped, ReplayModReplay mod) { //#if MC>=11600 int ticksThisFrame = //#endif - super.beginRenderTick( + super.getPartialTicks( //#if MC>=11400 sysClock //#endif @@ -78,7 +78,7 @@ public InputReplayTimer(RenderTickCounter wrapped, ReplayModReplay mod) { GLFW.glfwPollEvents(); MCVer.processKeyBinds(); } - mc.keyboard.pollDebugCrash(); + mc.keyboardListener.tick(); //#else //$$ if (mc.currentScreen != null) { //#if MC>=10800 diff --git a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java index 247c9599..0f58e91b 100644 --- a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java +++ b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java @@ -4,12 +4,12 @@ import com.google.common.util.concurrent.SettableFuture; import com.replaymod.core.ReplayMod; import com.replaymod.gui.versions.Image; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import com.mojang.blaze3d.platform.GlStateManager; -import net.minecraft.client.util.ScreenshotUtils; +import net.minecraft.util.ScreenShotHelper; //#if MC>=11500 -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.matrix.MatrixStack; //#endif //#if MC<11400 @@ -41,7 +41,7 @@ public int getHeight() { return height; } - public static ListenableFuture take(final MinecraftClient mc, final int width, final int height) { + public static ListenableFuture take(final Minecraft mc, final int width, final int height) { final SettableFuture future = SettableFuture.create(); Runnable runnable = new Runnable() { @Override @@ -50,12 +50,12 @@ public void run() { return; } - int frameWidth = mc.getWindow().getFramebufferWidth(); - int frameHeight = mc.getWindow().getFramebufferHeight(); + int frameWidth = mc.getMainWindow().getFramebufferWidth(); + int frameHeight = mc.getMainWindow().getFramebufferHeight(); - final boolean guiHidden = mc.options.hudHidden; + final boolean guiHidden = mc.gameSettings.hideGUI; try { - mc.options.hudHidden = true; + mc.gameSettings.hideGUI = true; // Render frame without GUI GlStateManager.pushMatrix(); @@ -65,10 +65,10 @@ public void run() { , true //#endif ); - mc.getFramebuffer().beginWrite(true); + mc.getFramebuffer().bindFramebuffer(true); GlStateManager.enableTexture(); - float tickDelta = mc.getTickDelta(); + float tickDelta = mc.getRenderPartialTicks(); //#if MC>=11500 mc.gameRenderer.renderWorld(tickDelta, System.nanoTime(), new MatrixStack()); //#else @@ -83,24 +83,24 @@ public void run() { //#endif //#endif - mc.getFramebuffer().endWrite(); + mc.getFramebuffer().unbindFramebuffer(); GlStateManager.popMatrix(); GlStateManager.pushMatrix(); - mc.getFramebuffer().draw(frameWidth, frameHeight); + mc.getFramebuffer().framebufferRender(frameWidth, frameHeight); GlStateManager.popMatrix(); } catch (Throwable t) { future.setException(t); return; } finally { // Reset GUI settings - mc.options.hudHidden = guiHidden; + mc.gameSettings.hideGUI = guiHidden; } // The frame without GUI has been rendered // Read it, create the screenshot and finish the future try { //#if MC>=11400 - Image image = new Image(ScreenshotUtils.takeScreenshot(frameWidth, frameHeight, mc.getFramebuffer())); + Image image = new Image(ScreenShotHelper.createScreenshot(frameWidth, frameHeight, mc.getFramebuffer())); //#else //$$ // We're using Minecraft's ScreenShotHelper even though it writes the screenshot to //$$ // disk for better maintainability diff --git a/src/main/java/com/replaymod/replay/QuickReplaySender.java b/src/main/java/com/replaymod/replay/QuickReplaySender.java index 5295ac23..4c42f973 100644 --- a/src/main/java/com/replaymod/replay/QuickReplaySender.java +++ b/src/main/java/com/replaymod/replay/QuickReplaySender.java @@ -18,13 +18,13 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerAdapter; import io.netty.channel.ChannelHandlerContext; -import net.minecraft.client.MinecraftClient; -import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; -import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket; -import net.minecraft.network.NetworkState; -import net.minecraft.network.NetworkSide; -import net.minecraft.network.Packet; -import net.minecraft.network.PacketByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.network.play.server.SPlayerPositionLookPacket; +import net.minecraft.network.play.server.SRespawnPacket; +import net.minecraft.network.ProtocolType; +import net.minecraft.network.PacketDirection; +import net.minecraft.network.IPacket; +import net.minecraft.network.PacketBuffer; import javax.annotation.Nullable; import java.io.IOException; @@ -32,7 +32,7 @@ import java.util.function.Consumer; //#if MC>=11602 -import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.util.registry.DynamicRegistries; import net.minecraft.util.registry.Registry; //#endif @@ -42,7 +42,7 @@ //$$ import net.minecraft.world.level.LevelGeneratorType; //#endif //#if MC>=11400 -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.DimensionType; //#else //$$ import net.minecraft.world.EnumDifficulty; //#endif @@ -52,7 +52,7 @@ //#endif //#if MC>=11002 -import net.minecraft.world.GameMode; +import net.minecraft.world.GameType; //#else //$$ import net.minecraft.world.WorldSettings.GameType; //#endif @@ -69,10 +69,10 @@ */ @ChannelHandler.Sharable public class QuickReplaySender extends ChannelHandlerAdapter implements ReplaySender { - private final MinecraftClient mc = getMinecraft(); + private final Minecraft mc = getMinecraft(); private final ReplayModReplay mod; - private final RandomAccessReplay> replay; + private final RandomAccessReplay> replay; private final EventHandler eventHandler = new EventHandler(); private ChannelHandlerContext ctx; @@ -93,14 +93,14 @@ public class QuickReplaySender extends ChannelHandlerAdapter implements ReplaySe public QuickReplaySender(ReplayModReplay mod, ReplayFile replayFile) { this.mod = mod; - this.replay = new RandomAccessReplay>(replayFile, getPacketTypeRegistry(false)) { + this.replay = new RandomAccessReplay>(replayFile, getPacketTypeRegistry(false)) { private byte[] buf = new byte[0]; @Override - protected Packet decode(com.github.steveice10.netty.buffer.ByteBuf byteBuf) throws IOException { + protected IPacket decode(com.github.steveice10.netty.buffer.ByteBuf byteBuf) throws IOException { int packetId = new ByteBufNetInput(byteBuf).readVarInt(); //#if MC>=11500 - Packet mcPacket = NetworkState.PLAY.getPacketHandler(NetworkSide.CLIENTBOUND, packetId); + IPacket mcPacket = ProtocolType.PLAY.getPacket(PacketDirection.CLIENTBOUND, packetId); //#else //$$ Packet mcPacket; //$$ try { @@ -117,13 +117,13 @@ protected Packet decode(com.github.steveice10.netty.buffer.ByteBuf byteBuf) t byteBuf.readBytes(buf, 0, size); ByteBuf wrappedBuf = Unpooled.wrappedBuffer(buf); wrappedBuf.writerIndex(size); - mcPacket.read(new PacketByteBuf(wrappedBuf)); + mcPacket.readPacketData(new PacketBuffer(wrappedBuf)); } return mcPacket; } @Override - protected void dispatch(Packet packet) { + protected void dispatch(IPacket packet) { ctx.fireChannelRead(packet); } }; @@ -190,17 +190,17 @@ public void onFailure(Throwable t) { public void restart() { replay.reset(); - ctx.fireChannelRead(new PlayerRespawnS2CPacket( + ctx.fireChannelRead(new SRespawnPacket( //#if MC>=11600 //#if MC>=11602 - DimensionType.addRegistryDefaults(new DynamicRegistryManager.Impl()).get(Registry.DIMENSION_TYPE_KEY).get(DimensionType.OVERWORLD_REGISTRY_KEY), + DimensionType.registerTypes(new DynamicRegistries.Impl()).getRegistry(Registry.DIMENSION_TYPE_KEY).getValueForKey(DimensionType.OVERWORLD), //#else //$$ DimensionType.OVERWORLD_REGISTRY_KEY, //#endif World.OVERWORLD, 0, - GameMode.SPECTATOR, - GameMode.SPECTATOR, + GameType.SPECTATOR, + GameType.SPECTATOR, false, false, false @@ -220,7 +220,7 @@ public void restart() { //$$ GameMode.SPECTATOR //#endif )); - ctx.fireChannelRead(new PlayerPositionLookS2CPacket(0, 0, 0, 0, 0, Collections.emptySet(), 0)); + ctx.fireChannelRead(new SPlayerPositionLookPacket(0, 0, 0, 0, 0, Collections.emptySet(), 0)); } @Override diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index d8114bac..a7a657bf 100644 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -28,24 +28,24 @@ import com.replaymod.gui.popup.AbstractGuiPopup; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.embedded.EmbeddedChannel; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.DownloadingTerrainScreen; -import net.minecraft.client.network.ClientLoginNetworkHandler; -import net.minecraft.client.util.Window; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.DownloadTerrainScreen; +import net.minecraft.client.network.login.ClientLoginNetHandler; +import net.minecraft.client.MainWindow; +import net.minecraft.crash.CrashReport; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.ClientConnection; +import net.minecraft.network.NetworkManager; import java.io.IOException; import java.util.*; //#if FABRIC<1 -//$$ import io.netty.util.AttributeKey; +import io.netty.util.AttributeKey; //#endif //#if MC>=11600 -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.matrix.MatrixStack; //#endif //#if MC>=11500 @@ -74,9 +74,9 @@ //#endif //#if MC>=10800 -import net.minecraft.network.NetworkSide; +import net.minecraft.network.PacketDirection; //#if MC>=11400 -//$$ import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.NetworkHooks; //#else //$$ import com.mojang.authlib.GameProfile; //$$ import net.minecraft.client.network.NetHandlerPlayClient; @@ -104,7 +104,7 @@ public class ReplayHandler { - private static MinecraftClient mc = getMinecraft(); + private static Minecraft mc = getMinecraft(); /** * The file currently being played. @@ -148,7 +148,7 @@ public class ReplayHandler { private UUID spectating; public ReplayHandler(ReplayFile replayFile, boolean asyncMode) throws IOException { - Preconditions.checkState(mc.isOnThread(), "Must be called from Minecraft thread."); + Preconditions.checkState(mc.isOnExecutionThread(), "Must be called from Minecraft thread."); this.replayFile = replayFile; replayDuration = replayFile.getMetaData().getDuration(); @@ -171,19 +171,19 @@ public ReplayHandler(ReplayFile replayFile, boolean asyncMode) throws IOExceptio } void restartedReplay() { - Preconditions.checkState(mc.isOnThread(), "Must be called from Minecraft thread."); + Preconditions.checkState(mc.isOnExecutionThread(), "Must be called from Minecraft thread."); channel.close(); //#if MC>=11400 - mc.mouse.unlockCursor(); + mc.mouseHelper.ungrabMouse(); //#else //$$ mc.setIngameNotInFocus(); //#endif // Force re-creation of camera entity by unloading the previous world //#if MC>=11400 - mc.disconnect(); + mc.unloadWorld(); //#else //$$ // We need to re-set the GUI screen because having one with `allowsUserInput = true` active during world //$$ // load (i.e. before player is set) will crash MC... @@ -197,7 +197,7 @@ void restartedReplay() { } public void endReplay() throws IOException { - Preconditions.checkState(mc.isOnThread(), "Must be called from Minecraft thread."); + Preconditions.checkState(mc.isOnExecutionThread(), "Must be called from Minecraft thread."); ReplayClosingCallback.EVENT.invoker().replayClosing(this); @@ -223,7 +223,7 @@ public void endReplay() throws IOException { if (mc.world != null) { //#if MC>=11400 - mc.disconnect(); + mc.unloadWorld(); //#else //$$ mc.world.sendQuittingDisconnectingPacket(); //$$ mc.loadWorld(null); @@ -240,22 +240,22 @@ public void endReplay() throws IOException { ReplayModReplay.instance.forcefullyStopReplay(); - mc.openScreen(null); + mc.displayGuiScreen(null); ReplayClosedCallback.EVENT.invoker().replayClosed(this); } private void setup() { - Preconditions.checkState(mc.isOnThread(), "Must be called from Minecraft thread."); + Preconditions.checkState(mc.isOnExecutionThread(), "Must be called from Minecraft thread."); //#if MC>=11100 - mc.inGameHud.getChatHud().clear(false); + mc.ingameGUI.getChatGUI().clearChatMessages(false); //#else //$$ mc.ingameGUI.getChatGUI().clearChatMessages(); //#endif //#if MC>=10800 - ClientConnection networkManager = new ClientConnection(NetworkSide.CLIENTBOUND) { + NetworkManager networkManager = new NetworkManager(PacketDirection.CLIENTBOUND) { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { t.printStackTrace(); @@ -285,7 +285,7 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { //$$ FMLClientHandler.instance().connectToRealmsServer(null, 0); // just to init the playClientBlock latch //#endif - networkManager.setPacketListener(new ClientLoginNetworkHandler( + networkManager.setNetHandler(new ClientLoginNetHandler( networkManager, mc, null @@ -310,7 +310,7 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { channel.pipeline().fireChannelActive(); //#if FABRIC<1 && MC>=11400 - //$$ NetworkHooks.registerClientLoginChannel(networkManager); + NetworkHooks.registerClientLoginChannel(networkManager); //#endif } @@ -350,7 +350,7 @@ public void onSuccess(@Nullable Void result) { @Override public void onFailure(@Nonnull Throwable t) { String message = "Failed to initialize quick mode. It will not be available."; - Utils.error(LOGGER, overlay, CrashReport.create(t, message), popup::close); + Utils.error(LOGGER, overlay, CrashReport.makeCrashReport(t, message), popup::close); } }); } @@ -403,7 +403,7 @@ public void setQuickMode(boolean quickMode) { CameraEntity cam = getCameraEntity(); if (cam != null) { - targetCameraPosition = new Location(cam.getX(), cam.getY(), cam.getZ(), cam.yaw, cam.pitch); + targetCameraPosition = new Location(cam.getPosX(), cam.getPosY(), cam.getPosZ(), cam.rotationYaw, cam.rotationPitch); } else { targetCameraPosition = null; } @@ -477,7 +477,7 @@ public void spectateEntity(Entity e) { spectating = null; e = cameraEntity; } else if (e instanceof PlayerEntity) { - spectating = e.getUuid(); + spectating = e.getUniqueID(); } if (e == cameraEntity) { @@ -486,8 +486,8 @@ public void spectateEntity(Entity e) { cameraEntity.setCameraController(new SpectatorCameraController(cameraEntity)); } - if (mc.getCameraEntity() != e) { - mc.setCameraEntity(e); + if (mc.getRenderViewEntity() != e) { + mc.setRenderViewEntity(e); cameraEntity.setCameraPosRot(e); } } @@ -505,7 +505,7 @@ public void spectateCamera() { * @return {@code true} if the camera is the view entity, {@code false} otherwise */ public boolean isCameraView() { - return mc.player instanceof CameraEntity && mc.player == mc.getCameraEntity(); + return mc.player instanceof CameraEntity && mc.player == mc.getRenderViewEntity(); } /** @@ -539,18 +539,18 @@ public void doJump(int targetTime, boolean retainCameraPosition) { } // Update all entity positions (especially prev/lastTick values) - for (Entity entity : mc.world.getEntities()) { + for (Entity entity : mc.world.getAllEntities()) { skipTeleportInterpolation(entity); - entity.lastRenderX = entity.prevX = entity.getX(); - entity.lastRenderY = entity.prevY = entity.getY(); - entity.lastRenderZ = entity.prevZ = entity.getZ(); - entity.prevYaw = entity.yaw; - entity.prevPitch = entity.pitch; + entity.lastTickPosX = entity.prevPosX = entity.getPosX(); + entity.lastTickPosY = entity.prevPosY = entity.getPosY(); + entity.lastTickPosZ = entity.prevPosZ = entity.getPosZ(); + entity.prevRotationYaw = entity.rotationYaw; + entity.prevRotationPitch = entity.rotationPitch; } // Run previous tick //#if MC>=11400 - mc.tick(); + mc.runTick(); //#else //$$ try { //$$ mc.runTick(); @@ -563,7 +563,7 @@ public void doJump(int targetTime, boolean retainCameraPosition) { quickReplaySender.sendPacketsTill(targetTime); // Immediately apply player teleport interpolation - for (Entity entity : mc.world.getEntities()) { + for (Entity entity : mc.world.getAllEntities()) { skipTeleportInterpolation(entity); } return; @@ -576,14 +576,14 @@ public void doJump(int targetTime, boolean retainCameraPosition) { } if (targetTime < replaySender.currentTimeStamp()) { - mc.openScreen(null); + mc.displayGuiScreen(null); } if (retainCameraPosition) { CameraEntity cam = getCameraEntity(); if (cam != null) { - targetCameraPosition = new Location(cam.getX(), cam.getY(), cam.getZ(), - cam.yaw, cam.pitch); + targetCameraPosition = new Location(cam.getPosX(), cam.getPosY(), cam.getPosZ(), + cam.rotationYaw, cam.rotationPitch); } else { targetCameraPosition = null; } @@ -611,13 +611,13 @@ public void doJump(int targetTime, boolean retainCameraPosition) { //#endif ); enableTexture(); - mc.getFramebuffer().beginWrite(true); - Window window = mc.getWindow(); + mc.getFramebuffer().bindFramebuffer(true); + MainWindow window = mc.getMainWindow(); //#if MC>=11500 - RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC); + RenderSystem.clear(256, Minecraft.IS_RUNNING_ON_MAC); RenderSystem.matrixMode(GL11.GL_PROJECTION); RenderSystem.loadIdentity(); - RenderSystem.ortho(0, window.getFramebufferWidth() / window.getScaleFactor(), window.getFramebufferHeight() / window.getScaleFactor(), 0, 1000, 3000); + RenderSystem.ortho(0, window.getFramebufferWidth() / window.getGuiScaleFactor(), window.getFramebufferHeight() / window.getGuiScaleFactor(), 0, 1000, 3000); RenderSystem.matrixMode(GL11.GL_MODELVIEW); RenderSystem.loadIdentity(); RenderSystem.translatef(0, 0, -2000); @@ -639,16 +639,16 @@ public void doJump(int targetTime, boolean retainCameraPosition) { //$$ guiScreen.toMinecraft().drawScreen(0, 0, 0); //#endif //#endif - guiScreen.toMinecraft().removed(); + guiScreen.toMinecraft().onClose(); - mc.getFramebuffer().endWrite(); + mc.getFramebuffer().unbindFramebuffer(); popMatrix(); pushMatrix(); - mc.getFramebuffer().draw(mc.getWindow().getFramebufferWidth(), mc.getWindow().getFramebufferHeight()); + mc.getFramebuffer().framebufferRender(mc.getMainWindow().getFramebufferWidth(), mc.getMainWindow().getFramebufferHeight()); popMatrix(); //#if MC>=11500 - mc.getWindow().swapBuffers(); + mc.getMainWindow().flipFrame(); //#else //#if MC>=11400 //$$ mc.window.setFullscreen(true); @@ -661,7 +661,7 @@ public void doJump(int targetTime, boolean retainCameraPosition) { do { replaySender.sendPacketsTill(targetTime); targetTime += 500; - } while (mc.player == null || mc.currentScreen instanceof DownloadingTerrainScreen); + } while (mc.player == null || mc.currentScreen instanceof DownloadTerrainScreen); replaySender.setAsyncMode(true); replaySender.setReplaySpeed(0); @@ -671,19 +671,19 @@ public void doJump(int targetTime, boolean retainCameraPosition) { //$$ } //#endif - mc.getNetworkHandler().getConnection() + mc.getConnection().getNetworkManager() //#if MC>=11400 .tick(); //#else //$$ .processReceivedPackets(); //#endif - for (Entity entity : mc.world.getEntities()) { + for (Entity entity : mc.world.getAllEntities()) { skipTeleportInterpolation(entity); - entity.lastRenderX = entity.prevX = entity.getX(); - entity.lastRenderY = entity.prevY = entity.getY(); - entity.lastRenderZ = entity.prevZ = entity.getZ(); - entity.prevYaw = entity.yaw; - entity.prevPitch = entity.pitch; + entity.lastTickPosX = entity.prevPosX = entity.getPosX(); + entity.lastTickPosY = entity.prevPosY = entity.getPosY(); + entity.lastTickPosZ = entity.prevPosZ = entity.getPosZ(); + entity.prevRotationYaw = entity.rotationYaw; + entity.prevRotationPitch = entity.rotationPitch; } //#if MC>=10800 && MC<11400 //$$ try { @@ -692,7 +692,7 @@ public void doJump(int targetTime, boolean retainCameraPosition) { //$$ e.printStackTrace(); // This should never be thrown but whatever //$$ } //#else - mc.tick(); + mc.runTick(); //#endif //finally, updating the camera's position (which is not done by the sync jumping) @@ -709,9 +709,9 @@ private void skipTeleportInterpolation(Entity entity) { if (entity instanceof LivingEntity && !(entity instanceof CameraEntity)) { LivingEntity e = (LivingEntity) entity; Mixin_EntityLivingBaseAccessor ea = (Mixin_EntityLivingBaseAccessor) e; - e.updatePosition(ea.getInterpTargetX(), ea.getInterpTargetY(), ea.getInterpTargetZ()); - e.yaw = (float) ea.getInterpTargetYaw(); - e.pitch = (float) ea.getInterpTargetPitch(); + e.setPosition(ea.getInterpTargetX(), ea.getInterpTargetY(), ea.getInterpTargetZ()); + e.rotationYaw = (float) ea.getInterpTargetYaw(); + e.rotationPitch = (float) ea.getInterpTargetPitch(); } //#else //$$ if (entity instanceof EntityOtherPlayerMP) { diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index 3709c40d..7e89d1b7 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -20,8 +20,8 @@ import com.replaymod.replay.handler.GuiHandler; import com.replaymod.replaystudio.data.Marker; import com.replaymod.replaystudio.replay.ReplayFile; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -66,11 +66,11 @@ public void run() { if (camera != null) { Marker marker = new Marker(); marker.setTime(replayHandler.getReplaySender().currentTimeStamp()); - marker.setX(camera.getX()); - marker.setY(camera.getY()); - marker.setZ(camera.getZ()); - marker.setYaw(camera.yaw); - marker.setPitch(camera.pitch); + marker.setX(camera.getPosX()); + marker.setY(camera.getPosY()); + marker.setZ(camera.getPosZ()); + marker.setYaw(camera.rotationYaw); + marker.setPitch(camera.rotationPitch); marker.setRoll(camera.roll); replayHandler.getOverlay().timeline.addMarker(marker); } @@ -82,7 +82,7 @@ public void run() { @Override public void run() { if (replayHandler != null) { - MinecraftClient mc = MCVer.getMinecraft(); + Minecraft mc = MCVer.getMinecraft(); ListenableFuture future = NoGuiScreenshot.take(mc, 1280, 720); Futures.addCallback(future, new FutureCallback() { @Override @@ -186,14 +186,14 @@ public ReplayHandler startReplay(ReplayFile replayFile, boolean checkModCompat, } } replayHandler = new ReplayHandler(replayFile, asyncMode); - KeyBinding.updateKeysByCode(); // see Mixin_ContextualKeyBindings + KeyBinding.resetKeyBindingArrayAndHash(); // see Mixin_ContextualKeyBindings return replayHandler; } public void forcefullyStopReplay() { replayHandler = null; - KeyBinding.updateKeysByCode(); // see Mixin_ContextualKeyBindings + KeyBinding.resetKeyBindingArrayAndHash(); // see Mixin_ContextualKeyBindings } public ReplayMod getCore() { diff --git a/src/main/java/com/replaymod/replay/ReplaySender.java b/src/main/java/com/replaymod/replay/ReplaySender.java index 5fbbeb65..54afbd7e 100644 --- a/src/main/java/com/replaymod/replay/ReplaySender.java +++ b/src/main/java/com/replaymod/replay/ReplaySender.java @@ -2,7 +2,7 @@ import com.replaymod.mixin.MinecraftAccessor; import com.replaymod.mixin.TimerAccessor; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import static com.replaymod.core.versions.MCVer.getMinecraft; @@ -14,7 +14,7 @@ public interface ReplaySender { * @return {@code true} if it is paused, {@code false} otherwise */ public default boolean paused() { - MinecraftClient mc = getMinecraft(); + Minecraft mc = getMinecraft(); TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer(); //#if MC>=11200 return timer.getTickLength() == Float.POSITIVE_INFINITY; diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index 95d2a8e6..adabc09b 100644 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -17,35 +17,35 @@ import com.replaymod.replay.Setting; import com.replaymod.mixin.FirstPersonRendererAccessor; import com.replaymod.replaystudio.util.Location; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.AbstractClientPlayerEntity; +import net.minecraft.client.network.play.ClientPlayNetHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.stat.StatHandler; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Box; +import net.minecraft.stats.StatisticsManager; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; //#if FABRIC>=1 //#else -//$$ import net.minecraftforge.client.event.EntityViewRenderEvent; -//$$ import net.minecraftforge.client.event.RenderGameOverlayEvent; -//$$ import net.minecraftforge.common.MinecraftForge; -//$$ import net.minecraftforge.eventbus.api.EventPriority; -//$$ import net.minecraftforge.eventbus.api.SubscribeEvent; -//$$ import com.replaymod.replay.events.ReplayChatMessageEvent; -//$$ 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.common.MinecraftForge; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import com.replaymod.replay.events.ReplayChatMessageEvent; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.World; //#endif //#if MC>=11400 import net.minecraft.client.world.ClientWorld; import net.minecraft.fluid.Fluid; -import net.minecraft.tag.Tag; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; +import net.minecraft.tags.ITag; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; //#else //$$ import com.replaymod.replay.events.ReplayChatMessageEvent; //$$ import net.minecraft.util.math.RayTraceResult; @@ -61,10 +61,10 @@ //#endif //#if MC>=10904 -import net.minecraft.entity.EquipmentSlot; +import net.minecraft.inventory.EquipmentSlotType; //#if MC>=11200 //#if MC>=11400 -import net.minecraft.client.recipebook.ClientRecipeBook; +import net.minecraft.client.util.ClientRecipeBook; //#else //$$ import net.minecraft.stats.RecipeBook; //#endif @@ -73,8 +73,8 @@ //#endif //#if MC>=10800 -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.render.entity.PlayerModelPart; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.entity.player.PlayerModelPart; //#else //$$ import net.minecraft.client.entity.EntityClientPlayerMP; //$$ import net.minecraft.util.Session; @@ -124,7 +124,7 @@ public class CameraEntity private EventHandler eventHandler = new EventHandler(); public CameraEntity( - MinecraftClient mcIn, + Minecraft mcIn, //#if MC>=11400 ClientWorld worldIn, //#else @@ -133,8 +133,8 @@ public CameraEntity( //#if MC<10800 //$$ Session session, //#endif - ClientPlayNetworkHandler netHandlerPlayClient, - StatHandler statisticsManager + ClientPlayNetHandler netHandlerPlayClient, + StatisticsManager statisticsManager //#if MC>=11200 //#if MC>=11400 , ClientRecipeBook recipeBook @@ -159,7 +159,7 @@ public CameraEntity( //#endif ); //#if MC>=10900 - setUuid(CAMERA_UUID); + setUniqueId(CAMERA_UUID); //#else //$$ entityUniqueID = CAMERA_UUID; //#endif @@ -186,7 +186,7 @@ public void setCameraController(CameraController cameraController) { * @param z Delta in Z direction */ public void moveCamera(double x, double y, double z) { - setCameraPosition(this.getX() + x, this.getY() + y, this.getZ() + z); + setCameraPosition(this.getPosX() + x, this.getPosY() + y, this.getPosZ() + z); } /** @@ -196,10 +196,10 @@ public void moveCamera(double x, double y, double z) { * @param z Z coordinate */ public void setCameraPosition(double x, double y, double z) { - this.lastRenderX = this.prevX = x; - this.lastRenderY = this.prevY = y; - this.lastRenderZ = this.prevZ = z; - this.setPos(x, y, z); + this.lastTickPosX = this.prevPosX = x; + this.lastTickPosY = this.prevPosY = y; + this.lastTickPosZ = this.prevPosZ = z; + this.setRawPosition(x, y, z); updateBoundingBox(); } @@ -210,8 +210,8 @@ public void setCameraPosition(double x, double y, double z) { * @param roll Roll in degrees */ public void setCameraRotation(float yaw, float pitch, float roll) { - this.prevYaw = this.yaw = yaw; - this.prevPitch = this.pitch = pitch; + this.prevRotationYaw = this.rotationYaw = yaw; + this.prevRotationPitch = this.rotationPitch = pitch; this.roll = roll; } @@ -235,17 +235,17 @@ public void setCameraPosRot(Entity to) { //#else //$$ float yOffset = 1.62f; // Magic value (eye height) from EntityRenderer#orientCamera //#endif - this.prevX = to.prevX; - this.prevY = to.prevY + yOffset; - this.prevZ = to.prevZ; - this.prevYaw = to.prevYaw; - this.prevPitch = to.prevPitch; - this.setPos(to.getX(), to.getY(), to.getZ()); - this.yaw = to.yaw; - this.pitch = to.pitch; - this.lastRenderX = to.lastRenderX; - this.lastRenderY = to.lastRenderY + yOffset; - this.lastRenderZ = to.lastRenderZ; + this.prevPosX = to.prevPosX; + this.prevPosY = to.prevPosY + yOffset; + this.prevPosZ = to.prevPosZ; + this.prevRotationYaw = to.prevRotationYaw; + this.prevRotationPitch = to.prevRotationPitch; + this.setRawPosition(to.getPosX(), to.getPosY(), to.getPosZ()); + this.rotationYaw = to.rotationYaw; + this.rotationPitch = to.rotationPitch; + this.lastTickPosX = to.lastTickPosX; + this.lastTickPosY = to.lastTickPosY + yOffset; + this.lastTickPosZ = to.lastTickPosZ; updateBoundingBox(); } @@ -255,12 +255,12 @@ private void updateBoundingBox() { float height = getHeight(); //#endif //#if MC>=10800 - setBoundingBox(new Box( + setBoundingBox(new AxisAlignedBB( //#else //$$ this.boundingBox.setBB(AxisAlignedBB.getBoundingBox( //#endif - this.getX() - width / 2, this.getY(), this.getZ() - width / 2, - this.getX() + width / 2, this.getY() + height, this.getZ() + width / 2)); + this.getPosX() - width / 2, this.getPosY(), this.getPosZ() - width / 2, + this.getPosX() + width / 2, this.getPosY() + height, this.getPosZ() + width / 2)); } @Override @@ -270,15 +270,15 @@ public void tick() { //#else //$$ EntityLivingBase view = //#endif - this.client.getCameraEntity(); + this.mc.getRenderViewEntity(); if (view != null) { // Make sure we're always spectating the right entity // This is important if the spectated player respawns as their // entity is recreated and we have to spectate a new entity UUID spectating = ReplayModReplay.instance.getReplayHandler().getSpectatedUUID(); - if (spectating != null && (view.getUuid() != spectating + if (spectating != null && (view.getUniqueID() != spectating || view.world != this.world) - || this.world.getEntityById(view.getEntityId()) != view) { + || this.world.getEntityByID(view.getEntityId()) != view) { if (spectating == null) { // Entity (non-player) died, stop spectating ReplayModReplay.instance.getReplayHandler().spectateEntity(this); @@ -286,9 +286,9 @@ public void tick() { } view = this.world.getPlayerByUuid(spectating); if (view != null) { - this.client.setCameraEntity(view); + this.mc.setRenderViewEntity(view); } else { - this.client.setCameraEntity(this); + this.mc.setRenderViewEntity(this); return; } } @@ -301,25 +301,25 @@ public void tick() { } @Override - public void afterSpawn() { + public void preparePlayerToSpawn() { // Make sure our world is up-to-date in case of world changes - if (this.client.world != null) { - this.world = this.client.world; + if (this.mc.world != null) { + this.world = this.mc.world; } - super.afterSpawn(); + super.preparePlayerToSpawn(); } @Override public void setRotation(float yaw, float pitch) { - if (this.client.getCameraEntity() == this) { + if (this.mc.getRenderViewEntity() == this) { // Only update camera rotation when the camera is the view super.setRotation(yaw, pitch); } } @Override - public boolean isInsideWall() { - return falseUnlessSpectating(Entity::isInsideWall); // Make sure no suffocation overlay is rendered + public boolean isEntityInsideOpaqueBlock() { + return falseUnlessSpectating(Entity::isEntityInsideOpaqueBlock); // Make sure no suffocation overlay is rendered } //#if MC<11400 @@ -331,8 +331,8 @@ public boolean isInsideWall() { //#if MC>=11400 @Override - public boolean isSubmergedIn(Tag fluid) { - return falseUnlessSpectating(entity -> entity.isSubmergedIn(fluid)); + public boolean areEyesInFluid(ITag fluid) { + return falseUnlessSpectating(entity -> entity.areEyesInFluid(fluid)); } //#else //#if MC>=10800 @@ -354,12 +354,12 @@ public boolean isSubmergedIn(Tag fluid) { //#endif @Override - public boolean isOnFire() { - return falseUnlessSpectating(Entity::isOnFire); // Make sure no fire overlay is rendered + public boolean isBurning() { + return falseUnlessSpectating(Entity::isBurning); // Make sure no fire overlay is rendered } private boolean falseUnlessSpectating(Function property) { - Entity view = this.client.getCameraEntity(); + Entity view = this.mc.getRenderViewEntity(); if (view != null && view != this) { return property.apply(view); } @@ -367,19 +367,19 @@ private boolean falseUnlessSpectating(Function property) { } @Override - public boolean isPushable() { + public boolean canBePushed() { return false; // We are in full control of ourselves } //#if MC>=10800 @Override - protected void spawnSprintingParticles() { + protected void handleRunningEffect() { // We do not produce any particles, we are a camera } //#endif @Override - public boolean collides() { + public boolean canBeCollidedWith() { return false; // We are a camera, we cannot collide } @@ -393,7 +393,7 @@ public boolean isSpectator() { //#if MC>=11400 @Override - public boolean shouldRender(double double_1, double double_2, double double_3) { + public boolean isInRangeToRender3d(double double_1, double double_2, double double_3) { return false; // never render the camera otherwise it'd be visible e.g. in 3rd-person or with shaders } //#else @@ -408,10 +408,10 @@ public boolean shouldRender(double double_1, double double_2, double double_3) { //#if MC>=10800 @Override - public float getSpeed() { - Entity view = this.client.getCameraEntity(); + public float getFovModifier() { + Entity view = this.mc.getRenderViewEntity(); if (view != this && view instanceof AbstractClientPlayerEntity) { - return ((AbstractClientPlayerEntity) view).getSpeed(); + return ((AbstractClientPlayerEntity) view).getFovModifier(); } return 1; } @@ -424,7 +424,7 @@ public float getSpeed() { @Override public boolean isInvisible() { - Entity view = this.client.getCameraEntity(); + Entity view = this.mc.getRenderViewEntity(); if (view != this) { return view.isInvisible(); } @@ -432,69 +432,69 @@ public boolean isInvisible() { } //#if FABRIC>=1 - @Override - public Identifier getSkinTexture() { - Entity view = this.client.getCameraEntity(); - if (view != this && view instanceof PlayerEntity) { - return Utils.getResourceLocationForPlayerUUID(view.getUuid()); - } - return super.getSkinTexture(); - } - //#else //$$ @Override - //$$ public ResourceLocation getLocationSkin() { - //$$ Entity view = this.mc.getRenderViewEntity(); + //$$ public Identifier getSkinTexture() { + //$$ Entity view = this.client.getCameraEntity(); //$$ if (view != this && view instanceof PlayerEntity) { - //$$ return Utils.getResourceLocationForPlayerUUID(view.getUniqueID()); + //$$ return Utils.getResourceLocationForPlayerUUID(view.getUuid()); //$$ } - //$$ return super.getLocationSkin(); + //$$ return super.getSkinTexture(); //$$ } + //#else + @Override + public ResourceLocation getLocationSkin() { + Entity view = this.mc.getRenderViewEntity(); + if (view != this && view instanceof PlayerEntity) { + return Utils.getResourceLocationForPlayerUUID(view.getUniqueID()); + } + return super.getLocationSkin(); + } //#endif //#if MC>=10800 @Override - public String getModel() { - Entity view = this.client.getCameraEntity(); + public String getSkinType() { + Entity view = this.mc.getRenderViewEntity(); if (view != this && view instanceof AbstractClientPlayerEntity) { - return ((AbstractClientPlayerEntity) view).getModel(); + return ((AbstractClientPlayerEntity) view).getSkinType(); } - return super.getModel(); + return super.getSkinType(); } @Override - public boolean isPartVisible(PlayerModelPart modelPart) { - Entity view = this.client.getCameraEntity(); + public boolean isWearing(PlayerModelPart modelPart) { + Entity view = this.mc.getRenderViewEntity(); if (view != this && view instanceof PlayerEntity) { - return ((PlayerEntity) view).isPartVisible(modelPart); + return ((PlayerEntity) view).isWearing(modelPart); } - return super.isPartVisible(modelPart); + return super.isWearing(modelPart); } //#endif @Override - public float getHandSwingProgress(float renderPartialTicks) { - Entity view = this.client.getCameraEntity(); + public float getSwingProgress(float renderPartialTicks) { + Entity view = this.mc.getRenderViewEntity(); if (view != this && view instanceof PlayerEntity) { - return ((PlayerEntity) view).getHandSwingProgress(renderPartialTicks); + return ((PlayerEntity) view).getSwingProgress(renderPartialTicks); } return 0; } //#if MC>=10904 @Override - public float getAttackCooldownProgressPerTick() { - Entity view = this.client.getCameraEntity(); + public float getCooldownPeriod() { + Entity view = this.mc.getRenderViewEntity(); if (view != this && view instanceof PlayerEntity) { - return ((PlayerEntity) view).getAttackCooldownProgressPerTick(); + return ((PlayerEntity) view).getCooldownPeriod(); } return 1; } @Override - public float getAttackCooldownProgress(float adjustTicks) { - Entity view = this.client.getCameraEntity(); + public float getCooledAttackStrength(float adjustTicks) { + Entity view = this.mc.getRenderViewEntity(); if (view != this && view instanceof PlayerEntity) { - return ((PlayerEntity) view).getAttackCooldownProgress(adjustTicks); + return ((PlayerEntity) view).getCooledAttackStrength(adjustTicks); } // Default to 1 as to not render the cooldown indicator (renders for < 1) return 1; @@ -502,7 +502,7 @@ public float getAttackCooldownProgress(float adjustTicks) { @Override public Hand getActiveHand() { - Entity view = this.client.getCameraEntity(); + Entity view = this.mc.getRenderViewEntity(); if (view != this && view instanceof PlayerEntity) { return ((PlayerEntity) view).getActiveHand(); } @@ -510,30 +510,30 @@ public Hand getActiveHand() { } @Override - public boolean isUsingItem() { - Entity view = this.client.getCameraEntity(); + public boolean isHandActive() { + Entity view = this.mc.getRenderViewEntity(); if (view != this && view instanceof PlayerEntity) { - return ((PlayerEntity) view).isUsingItem(); + return ((PlayerEntity) view).isHandActive(); } - return super.isUsingItem(); + return super.isHandActive(); } //#if MC>=11400 @Override - protected void onEquipStack(ItemStack itemStack_1) { + protected void playEquipSound(ItemStack itemStack_1) { // Suppress equip sounds } //#endif //#if MC>=11400 @Override - public HitResult raycast(double maxDistance, float tickDelta, boolean fluids) { - HitResult result = super.raycast(maxDistance, tickDelta, fluids); + public RayTraceResult pick(double maxDistance, float tickDelta, boolean fluids) { + RayTraceResult result = super.pick(maxDistance, tickDelta, fluids); // Make sure we can never look at blocks (-> no outline) - if (result instanceof BlockHitResult) { - BlockHitResult blockResult = (BlockHitResult) result; - result = BlockHitResult.createMissed(result.getPos(), blockResult.getSide(), blockResult.getBlockPos()); + if (result instanceof BlockRayTraceResult) { + BlockRayTraceResult blockResult = (BlockRayTraceResult) result; + result = BlockRayTraceResult.createMiss(result.getHitVec(), blockResult.getFace(), blockResult.getPos()); } return result; @@ -597,7 +597,7 @@ public void remove() { } private void update() { - MinecraftClient mc = MinecraftClient.getInstance(); + Minecraft mc = Minecraft.getInstance(); if (mc.world != this.world) { if (eventHandler != null) { eventHandler.unregister(); @@ -614,10 +614,10 @@ private void update() { handleInputEvents(); Map keyBindings = ReplayMod.instance.getKeyBindingRegistry().getBindings(); - if (keyBindings.get("replaymod.input.rollclockwise").keyBinding.isPressed()) { + if (keyBindings.get("replaymod.input.rollclockwise").keyBinding.isKeyDown()) { roll += Utils.isCtrlDown() ? 0.2 : 1; } - if (keyBindings.get("replaymod.input.rollcounterclockwise").keyBinding.isPressed()) { + if (keyBindings.get("replaymod.input.rollcounterclockwise").keyBinding.isKeyDown()) { roll -= Utils.isCtrlDown() ? 0.2 : 1; } @@ -627,25 +627,25 @@ private void update() { } private void handleInputEvents() { - if (this.client.options.keyAttack.wasPressed() || this.client.options.keyUse.wasPressed()) { - if (this.client.currentScreen == null && canSpectate(this.client.targetedEntity)) { + if (this.mc.gameSettings.keyBindAttack.isPressed() || this.mc.gameSettings.keyBindUseItem.isPressed()) { + if (this.mc.currentScreen == null && canSpectate(this.mc.pointedEntity)) { ReplayModReplay.instance.getReplayHandler().spectateEntity( //#if MC<=10710 //$$ (EntityLivingBase) //#endif - this.client.targetedEntity); + this.mc.pointedEntity); // Make sure we don't exit right away //noinspection StatementWithEmptyBody - while (this.client.options.keySneak.wasPressed()); + while (this.mc.gameSettings.keyBindSneak.isPressed()); } } } private void updateArmYawAndPitch() { - this.lastRenderYaw = this.renderYaw; - this.lastRenderPitch = this.renderPitch; - this.renderPitch = this.renderPitch + (this.pitch - this.renderPitch) * 0.5f; - this.renderYaw = this.renderYaw + (this.yaw - this.renderYaw) * 0.5f; + this.prevRenderArmYaw = this.renderArmYaw; + this.prevRenderArmPitch = this.renderArmPitch; + this.renderArmPitch = this.renderArmPitch + (this.rotationPitch - this.renderArmPitch) * 0.5f; + this.renderArmYaw = this.renderArmYaw + (this.rotationYaw - this.renderArmYaw) * 0.5f; } public boolean canSpectate(Entity e) { @@ -658,11 +658,11 @@ public boolean canSpectate(Entity e) { //#if FABRIC<1 //#if MC>=11300 - //$$ @Override - //$$ public void sendMessage(ITextComponent component, UUID senderUUID) { - //$$ if (MinecraftForge.EVENT_BUS.post(new ReplayChatMessageEvent(this))) return; - //$$ super.sendMessage(component, senderUUID); - //$$ } + @Override + public void sendMessage(ITextComponent component, UUID senderUUID) { + if (MinecraftForge.EVENT_BUS.post(new ReplayChatMessageEvent(this))) return; + super.sendMessage(component, senderUUID); + } //#endif //#if MC<=11200 //$$ @Override @@ -679,7 +679,7 @@ public boolean canSpectate(Entity e) { //$$ public // All event handlers need to be public in 1.7.10 //#endif class EventHandler extends EventRegistrations { - private final MinecraftClient mc = getMinecraft(); + private final Minecraft mc = getMinecraft(); private EventHandler() {} @@ -697,7 +697,7 @@ private void onRenderUpdate() { { on(RenderSpectatorCrosshairCallback.EVENT, this::shouldRenderSpectatorCrosshair); } private Boolean shouldRenderSpectatorCrosshair() { - return canSpectate(mc.targetedEntity); + return canSpectate(mc.pointedEntity); } { on(RenderHotbarCallback.EVENT, this::shouldRenderHotbar); } @@ -719,7 +719,7 @@ private void onSettingsChanged(SettingsRegistry registry, SettingsRegistry.Setti { on(PreRenderHandCallback.EVENT, this::onRenderHand); } private boolean onRenderHand() { // Unless we are spectating another player, don't render our hand - Entity view = mc.getCameraEntity(); + Entity view = mc.getRenderViewEntity(); if (view == CameraEntity.this || !(view instanceof PlayerEntity)) { return true; // cancel hand rendering } else { @@ -728,14 +728,14 @@ private boolean onRenderHand() { if (lastHandRendered != player) { lastHandRendered = player; - FirstPersonRendererAccessor acc = (FirstPersonRendererAccessor) mc.gameRenderer.firstPersonRenderer; + FirstPersonRendererAccessor acc = (FirstPersonRendererAccessor) mc.gameRenderer.itemRenderer; //#if MC>=10904 acc.setPrevEquippedProgressMainHand(1); acc.setPrevEquippedProgressOffHand(1); acc.setEquippedProgressMainHand(1); acc.setEquippedProgressOffHand(1); - acc.setItemStackMainHand(player.getEquippedStack(EquipmentSlot.MAINHAND)); - acc.setItemStackOffHand(player.getEquippedStack(EquipmentSlot.OFFHAND)); + acc.setItemStackMainHand(player.getItemStackFromSlot(EquipmentSlotType.MAINHAND)); + acc.setItemStackOffHand(player.getItemStackFromSlot(EquipmentSlotType.OFFHAND)); //#else //$$ acc.setPrevEquippedProgress(1); //$$ acc.setEquippedProgress(1); @@ -744,8 +744,8 @@ private boolean onRenderHand() { //#endif - mc.player.renderYaw = mc.player.lastRenderYaw = player.yaw; - mc.player.renderPitch = mc.player.lastRenderPitch = player.pitch; + mc.player.renderArmYaw = mc.player.prevRenderArmYaw = player.rotationYaw; + mc.player.renderArmPitch = mc.player.prevRenderArmPitch = player.rotationPitch; } return false; } @@ -771,49 +771,49 @@ private boolean onRenderHand() { private boolean heldItemTooltipsWasTrue; //#if FABRIC>=1 - // FIXME fabric + //$$ // FIXME fabric //#else - //$$ @SubscribeEvent - //$$ public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) { - //$$ switch (event.getType()) { - //$$ case ALL: - //$$ heldItemTooltipsWasTrue = mc.gameSettings.heldItemTooltips; - //$$ mc.gameSettings.heldItemTooltips = false; - //$$ break; - //$$ case ARMOR: - //$$ case HEALTH: - //$$ case FOOD: - //$$ case AIR: - //$$ case HOTBAR: - //$$ case EXPERIENCE: - //$$ case HEALTHMOUNT: - //$$ case JUMPBAR: + @SubscribeEvent + public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) { + switch (event.getType()) { + case ALL: + heldItemTooltipsWasTrue = mc.gameSettings.heldItemTooltips; + mc.gameSettings.heldItemTooltips = false; + break; + case ARMOR: + case HEALTH: + case FOOD: + case AIR: + case HOTBAR: + case EXPERIENCE: + case HEALTHMOUNT: + case JUMPBAR: //#if MC>=10904 - //$$ case POTION_ICONS: + case POTION_ICONS: //#endif - //$$ event.setCanceled(true); - //$$ break; - //$$ case HELMET: - //$$ case PORTAL: - //$$ case CROSSHAIRS: - //$$ case BOSSHEALTH: + event.setCanceled(true); + break; + case HELMET: + case PORTAL: + case CROSSHAIRS: + case BOSSHEALTH: //#if MC>=10904 - //$$ case BOSSINFO: - //$$ case SUBTITLES: + case BOSSINFO: + case SUBTITLES: //#endif - //$$ case TEXT: - //$$ case CHAT: - //$$ case PLAYER_LIST: - //$$ case DEBUG: - //$$ break; - //$$ } - //$$ } - //$$ - //$$ @SubscribeEvent - //$$ public void postRenderGameOverlay(RenderGameOverlayEvent.Post event) { - //$$ if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) return; - //$$ mc.gameSettings.heldItemTooltips = heldItemTooltipsWasTrue; - //$$ } + case TEXT: + case CHAT: + case PLAYER_LIST: + case DEBUG: + break; + } + } + + @SubscribeEvent + public void postRenderGameOverlay(RenderGameOverlayEvent.Post event) { + if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) return; + mc.gameSettings.heldItemTooltips = heldItemTooltipsWasTrue; + } //#endif } } diff --git a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java index 316b4e25..a761e338 100644 --- a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java @@ -1,8 +1,8 @@ package com.replaymod.replay.camera; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; import static net.minecraft.util.math.MathHelper.cos; import static net.minecraft.util.math.MathHelper.sin; @@ -34,34 +34,34 @@ public ClassicCameraController(CameraEntity camera) { public void update(float partialTicksPassed) { boolean forward = false, backward = false, left = false, right = false, up = false, down = false; speedup = false; - for(KeyBinding kb : MinecraftClient.getInstance().options.keysAll) { - if(!kb.isPressed()) continue; - if(kb.getTranslationKey().equals("key.forward")) { + for(KeyBinding kb : Minecraft.getInstance().gameSettings.keyBindings) { + if(!kb.isKeyDown()) continue; + if(kb.getKeyDescription().equals("key.forward")) { forward = true; speedup = true; } - if(kb.getTranslationKey().equals("key.back")) { + if(kb.getKeyDescription().equals("key.back")) { backward = true; speedup = true; } - if(kb.getTranslationKey().equals("key.jump")) { + if(kb.getKeyDescription().equals("key.jump")) { up = true; speedup = true; } - if(kb.getTranslationKey().equals("key.left")) { + if(kb.getKeyDescription().equals("key.left")) { left = true; speedup = true; } - if(kb.getTranslationKey().equals("key.right")) { + if(kb.getKeyDescription().equals("key.right")) { right = true; speedup = true; } - if(kb.getTranslationKey().equals("key.sneak")) { + if(kb.getKeyDescription().equals("key.sneak")) { down = true; speedup = true; } @@ -137,7 +137,7 @@ private void updateMovement() { } private void setMovement(MoveDirection dir) { - float rotationPitch = camera.pitch, rotationYaw = camera.yaw; + float rotationPitch = camera.rotationPitch, rotationYaw = camera.rotationYaw; switch(dir) { case BACKWARD: direction = this.getVectorForRotation(-rotationPitch, rotationYaw - 180); diff --git a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java index a51aba9e..54a69a48 100644 --- a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java @@ -2,13 +2,13 @@ import com.replaymod.replay.ReplayModReplay; import com.replaymod.mixin.EntityPlayerAccessor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; //#if MC>=11400 -import net.minecraft.entity.EquipmentSlot; +import net.minecraft.inventory.EquipmentSlotType; //#endif //#if MC>=11400 @@ -29,17 +29,17 @@ public SpectatorCameraController(CameraEntity camera) { @Override public void update(float partialTicksPassed) { - MinecraftClient mc = getMinecraft(); - if (mc.options.keySneak.wasPressed()) { + Minecraft mc = getMinecraft(); + if (mc.gameSettings.keyBindSneak.isPressed()) { ReplayModReplay.instance.getReplayHandler().spectateCamera(); } // Soak up all remaining key presses - for (KeyBinding binding : Arrays.asList(mc.options.keyAttack, mc.options.keyUse, - mc.options.keyJump, mc.options.keySneak, mc.options.keyForward, - mc.options.keyBack, mc.options.keyLeft, mc.options.keyRight)) { + for (KeyBinding binding : Arrays.asList(mc.gameSettings.keyBindAttack, mc.gameSettings.keyBindUseItem, + mc.gameSettings.keyBindJump, mc.gameSettings.keyBindSneak, mc.gameSettings.keyBindForward, + mc.gameSettings.keyBindBack, mc.gameSettings.keyBindLeft, mc.gameSettings.keyBindRight)) { //noinspection StatementWithEmptyBody - while (binding.wasPressed()); + while (binding.isPressed()); } // Prevent mouse movement @@ -52,16 +52,16 @@ public void update(float partialTicksPassed) { // Always make sure the camera is in the exact same spot as the spectated entity // This is necessary as some rendering code for the hand doesn't respect the view entity // and always uses mc.thePlayer - Entity view = mc.getCameraEntity(); + Entity view = mc.getRenderViewEntity(); if (view != null && view != camera) { - camera.setCameraPosRot(mc.getCameraEntity()); + camera.setCameraPosRot(mc.getRenderViewEntity()); // If it's a player, also 'steal' its inventory so the rendering code knows what item to render if (view instanceof PlayerEntity) { PlayerEntity viewPlayer = (PlayerEntity) view; //#if MC>=11400 - camera.equipStack(EquipmentSlot.HEAD, viewPlayer.getEquippedStack(EquipmentSlot.HEAD)); - camera.equipStack(EquipmentSlot.MAINHAND, viewPlayer.getEquippedStack(EquipmentSlot.MAINHAND)); - camera.equipStack(EquipmentSlot.OFFHAND, viewPlayer.getEquippedStack(EquipmentSlot.OFFHAND)); + camera.setItemStackToSlot(EquipmentSlotType.HEAD, viewPlayer.getItemStackFromSlot(EquipmentSlotType.HEAD)); + camera.setItemStackToSlot(EquipmentSlotType.MAINHAND, viewPlayer.getItemStackFromSlot(EquipmentSlotType.MAINHAND)); + camera.setItemStackToSlot(EquipmentSlotType.OFFHAND, viewPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND)); //#else //$$ camera.inventory = viewPlayer.inventory; //#endif @@ -69,7 +69,7 @@ public void update(float partialTicksPassed) { EntityPlayerAccessor viewPlayerA = (EntityPlayerAccessor) viewPlayer; //#if MC>=10904 cameraA.setItemStackMainHand(viewPlayerA.getItemStackMainHand()); - camera.preferredHand = viewPlayer.preferredHand; + camera.swingingHand = viewPlayer.swingingHand; cameraA.setActiveItemStackUseCount(viewPlayerA.getActiveItemStackUseCount()); //#else //$$ cameraA.setItemInUse(viewPlayerA.getItemInUse()); diff --git a/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java b/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java index 10354be0..dc02fc30 100644 --- a/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java @@ -1,9 +1,9 @@ package com.replaymod.replay.camera; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.options.GameOptions; -import net.minecraft.client.options.KeyBinding; +import net.minecraft.client.Minecraft; +import net.minecraft.client.GameSettings; +import net.minecraft.client.settings.KeyBinding; /** * Camera controller performing vanilla creative-like camera movements. @@ -23,15 +23,15 @@ public class VanillaCameraController implements CameraController { private int speed; - public VanillaCameraController(MinecraftClient mc, CameraEntity camera) { + public VanillaCameraController(Minecraft mc, CameraEntity camera) { this.camera = camera; - GameOptions gameSettings = mc.options; - this.bindings[0] = gameSettings.keyForward; - this.bindings[1] = gameSettings.keyBack; - this.bindings[2] = gameSettings.keyLeft; - this.bindings[3] = gameSettings.keyRight; - this.bindings[4] = gameSettings.keyJump; - this.bindings[5] = gameSettings.keySneak; + GameSettings gameSettings = mc.gameSettings; + this.bindings[0] = gameSettings.keyBindForward; + this.bindings[1] = gameSettings.keyBindBack; + this.bindings[2] = gameSettings.keyBindLeft; + this.bindings[3] = gameSettings.keyBindRight; + this.bindings[4] = gameSettings.keyBindJump; + this.bindings[5] = gameSettings.keyBindSneak; } @Override @@ -39,13 +39,13 @@ public void update(float partialTicksPassed) { if (partialTicksPassed == 0) return; Vector3f direction = new Vector3f(0, 0, 0); for (int i = 0; i < 6; i++) { // First, get movement direction depending on keys pressed - if (bindings[i].isPressed()) { + if (bindings[i].isKeyDown()) { Vector3f.add(direction, DIRECTIONS[i], direction); } } if (direction.length() == 0) return; direction.normalise(direction); // Normalize, so we don't move quicker if we hold down multiple keys - double yawRadians = Math.toRadians(camera.yaw); + double yawRadians = Math.toRadians(camera.rotationYaw); float yawSin = (float) Math.sin(yawRadians), yawCos = (float) Math.cos(yawRadians); // Rotate by yaw direction.set( diff --git a/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java b/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java index 021e264a..8ab036a7 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java @@ -1,20 +1,20 @@ //#if FABRIC<=0 -//$$ package com.replaymod.replay.events; -//$$ -//$$ import com.replaymod.replay.camera.CameraEntity; -//$$ import net.minecraftforge.eventbus.api.Cancelable; -//$$ import net.minecraftforge.eventbus.api.Event; -//$$ -//$$ @Cancelable -//$$ public class ReplayChatMessageEvent extends Event { -//$$ private final CameraEntity cameraEntity; -//$$ -//$$ public ReplayChatMessageEvent(CameraEntity cameraEntity) { -//$$ this.cameraEntity = cameraEntity; -//$$ } -//$$ -//$$ public CameraEntity getCameraEntity() { -//$$ return cameraEntity; -//$$ } -//$$ } +package com.replaymod.replay.events; + +import com.replaymod.replay.camera.CameraEntity; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; + +@Cancelable +public class ReplayChatMessageEvent extends Event { + private final CameraEntity cameraEntity; + + public ReplayChatMessageEvent(CameraEntity cameraEntity) { + this.cameraEntity = cameraEntity; + } + + public CameraEntity getCameraEntity() { + return cameraEntity; + } +} //#endif diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java index daa81472..83978de0 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java @@ -15,7 +15,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -223,7 +223,7 @@ public boolean mouseRelease(ReadablePoint position, int button) { protected String getTooltipText(RenderInfo renderInfo) { Marker marker = getMarkerAt(renderInfo.mouseX, renderInfo.mouseY); if (marker != null) { - return marker.getName() != null ? marker.getName() : I18n.translate("replaymod.gui.ingame.unnamedmarker"); + return marker.getName() != null ? marker.getName() : I18n.format("replaymod.gui.ingame.unnamedmarker"); } return super.getTooltipText(renderInfo); } diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java index 75ed5a69..98371384 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java @@ -22,8 +22,8 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; -import net.minecraft.client.options.GameOptions; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.GameSettings; +import net.minecraft.client.resources.I18n; import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; @@ -44,7 +44,7 @@ public GuiElement getTooltip(RenderInfo renderInfo) { } else { // Pause button label = "replaymod.gui.ingame.menu.pause"; } - tooltip.setText(I18n.translate(label) + " (" + mod.keyPlayPause.getBoundKey() + ")"); + tooltip.setText(I18n.format(label) + " (" + mod.keyPlayPause.getBoundKey() + ")"); } return tooltip; } @@ -117,7 +117,7 @@ public void run() { @Override public void run() { double speed = getSpeedSliderValue(); - speedSlider.setText(I18n.translate("replaymod.gui.speed") + ": " + speed + "x"); + speedSlider.setText(I18n.format("replaymod.gui.speed") + ": " + speed + "x"); ReplaySender replaySender = replayHandler.getReplaySender(); if (!replaySender.paused()) { replaySender.setReplaySpeed(speed); @@ -157,7 +157,7 @@ public void setVisible(boolean visible) { @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { // Do not render overlay if all hud, or this one specifically, is hidden and we're not in some popup - if ((getMinecraft().options.hudHidden || hidden) && isAllowUserInput()) { + if ((getMinecraft().gameSettings.hideGUI || hidden) && isAllowUserInput()) { // Note that this only applies to when the mouse is visible, otherwise // the draw method isn't called in the first place return; @@ -173,8 +173,8 @@ protected GuiReplayOverlay getThis() { private class EventHandler extends EventRegistrations { { on(KeyBindingEventCallback.EVENT, this::onKeyBindingEvent); } private void onKeyBindingEvent() { - GameOptions gameSettings = getMinecraft().options; - while (gameSettings.keyChat.wasPressed() || gameSettings.keyCommand.wasPressed()) { + GameSettings gameSettings = getMinecraft().gameSettings; + while (gameSettings.keyBindChat.isPressed() || gameSettings.keyBindCommand.isPressed()) { if (!isMouseVisible()) { setMouseVisible(true); } diff --git a/src/main/java/com/replaymod/replay/gui/screen/GuiModCompatWarning.java b/src/main/java/com/replaymod/replay/gui/screen/GuiModCompatWarning.java index eefc17f2..6761a07c 100644 --- a/src/main/java/com/replaymod/replay/gui/screen/GuiModCompatWarning.java +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiModCompatWarning.java @@ -78,7 +78,7 @@ public GuiModCompatWarning(ModCompat.ModInfoDifference difference) { } } - cancelButton.onClick(() -> getMinecraft().openScreen(null)); + cancelButton.onClick(() -> getMinecraft().displayGuiScreen(null)); } @Override diff --git a/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java b/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java index 2ecac4e1..f445fb63 100644 --- a/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java @@ -9,8 +9,8 @@ import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.versions.Image; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.util.Formatting; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.util.text.TextFormatting; import com.replaymod.core.ReplayMod; import com.replaymod.core.SettingsRegistry; import com.replaymod.core.gui.GuiReplaySettings; @@ -37,9 +37,9 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.gui.screen.NoticeScreen; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashException; +import net.minecraft.client.gui.screen.AlertScreen; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.ReportedException; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOCase; import org.apache.commons.io.filefilter.SuffixFileFilter; @@ -67,7 +67,7 @@ import static com.replaymod.gui.versions.MCVer.getFontRenderer; //#if MC>=11400 -import net.minecraft.text.TranslatableText; +import net.minecraft.util.text.TranslationTextComponent; //#else //$$ import net.minecraft.client.resources.I18n; //#endif @@ -160,11 +160,11 @@ public void run() { } catch (IOException e) { // We failed (might also be their OS) e.printStackTrace(); - getMinecraft().openScreen(new NoticeScreen( + getMinecraft().displayGuiScreen(new AlertScreen( //#if MC>=11400 GuiReplayViewer.this::display, - new TranslatableText("replaymod.gui.viewer.delete.failed1"), - new TranslatableText("replaymod.gui.viewer.delete.failed2") + new TranslationTextComponent("replaymod.gui.viewer.delete.failed1"), + new TranslationTextComponent("replaymod.gui.viewer.delete.failed2") //#else //$$ I18n.format("replaymod.gui.viewer.delete.failed1"), //$$ I18n.format("replaymod.gui.viewer.delete.failed2") @@ -181,7 +181,7 @@ public void run() { String name = entry.name.getText(); GuiYesNoPopup.open(GuiReplayViewer.this, new com.replaymod.gui.element.GuiLabel().setI18nText("replaymod.gui.viewer.delete.linea").setColor(Colors.BLACK), - new com.replaymod.gui.element.GuiLabel().setI18nText("replaymod.gui.viewer.delete.lineb", name + Formatting.RESET).setColor(Colors.BLACK) + new com.replaymod.gui.element.GuiLabel().setI18nText("replaymod.gui.viewer.delete.lineb", name + TextFormatting.RESET).setColor(Colors.BLACK) ).setYesI18nLabel("replaymod.gui.delete").setNoI18nLabel("replaymod.gui.cancel").onAccept(() -> { try { FileUtils.forceDelete(entry.file); @@ -202,7 +202,7 @@ public void run() { public final com.replaymod.gui.element.GuiButton cancelButton = new com.replaymod.gui.element.GuiButton().onClick(new Runnable() { @Override public void run() { - getMinecraft().openScreen(null); + getMinecraft().displayGuiScreen(null); } }).setSize(73, 20).setI18nLabel("replaymod.gui.cancel"); @@ -223,7 +223,7 @@ public GuiReplayViewer(ReplayModReplay mod) { try { list.setFolder(mod.getCore().getReplayFolder().toFile()); } catch (IOException e) { - throw new CrashException(CrashReport.create(e, "Getting replay folder")); + throw new ReportedException(CrashReport.makeCrashReport(e, "Getting replay folder")); } setTitle(new com.replaymod.gui.element.GuiLabel().setI18nText("replaymod.gui.replayviewer")); @@ -447,9 +447,9 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render if (!filter.isEmpty()) { boolean anyMatches = getListPanel().calcMinSize().getHeight() > 0; - TextRenderer fontRenderer = getFontRenderer(); - int filterTextWidth = fontRenderer.getWidth(filter); - int filterTextHeight = fontRenderer.fontHeight; + FontRenderer fontRenderer = getFontRenderer(); + int filterTextWidth = fontRenderer.getStringWidth(filter); + int filterTextHeight = fontRenderer.FONT_HEIGHT; renderer.drawRect( size.getWidth() - 3 - 2 - filterTextWidth - 2, size.getHeight() - 3 - 2 - filterTextHeight - 2, @@ -507,7 +507,7 @@ public GuiReplayEntry(File file, ReplayMetaData metaData, Image thumbImage, List this.file = file; this.renderQueue = renderQueue; - name.setText(Formatting.UNDERLINE + Utils.fileNameToReplayName(file.getName())); + name.setText(TextFormatting.UNDERLINE + Utils.fileNameToReplayName(file.getName())); if (!StringUtils.isEmpty(metaData.getCustomServerName())) { server.setText(metaData.getCustomServerName()); } else if (StringUtils.isEmpty(metaData.getServerName()) diff --git a/src/main/java/com/replaymod/replay/handler/GuiHandler.java b/src/main/java/com/replaymod/replay/handler/GuiHandler.java index fa91bffa..b89b0441 100644 --- a/src/main/java/com/replaymod/replay/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/replay/handler/GuiHandler.java @@ -11,26 +11,26 @@ import com.replaymod.gui.versions.callbacks.InitScreenCallback; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.gui.screen.GuiReplayViewer; -import net.minecraft.client.gui.screen.GameMenuScreen; -import net.minecraft.client.gui.screen.TitleScreen; -import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; +import net.minecraft.client.gui.screen.IngameMenuScreen; +import net.minecraft.client.gui.screen.MainMenuScreen; +import net.minecraft.client.gui.screen.MultiplayerScreen; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.AbstractButtonWidget; +import net.minecraft.client.gui.widget.Widget; //#if MC>=11600 -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; //#else //$$ import net.minecraft.client.resource.language.I18n; //#endif //#if FABRIC<1 -//$$ import net.minecraftforge.client.event.GuiScreenEvent; -//$$ import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; //#endif //#if MC>=11400 -import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.button.Button; //#endif import java.io.IOException; @@ -55,8 +55,8 @@ public GuiHandler(ReplayModReplay mod) { } { on(InitScreenCallback.EVENT, this::injectIntoIngameMenu); } - private void injectIntoIngameMenu(Screen guiScreen, List buttonList) { - if (!(guiScreen instanceof GameMenuScreen)) { + private void injectIntoIngameMenu(Screen guiScreen, List buttonList) { + if (!(guiScreen instanceof IngameMenuScreen)) { return; } @@ -65,11 +65,11 @@ private void injectIntoIngameMenu(Screen guiScreen, List b mod.getReplayHandler().getReplaySender().setReplaySpeed(0); //#if MC>=11600 - final TranslatableText BUTTON_OPTIONS = new TranslatableText("menu.options"); - final TranslatableText BUTTON_EXIT_SERVER = new TranslatableText("menu.disconnect"); - final TranslatableText BUTTON_ADVANCEMENTS = new TranslatableText("gui.advancements"); - final TranslatableText BUTTON_STATS = new TranslatableText("gui.stats"); - final TranslatableText BUTTON_OPEN_TO_LAN = new TranslatableText("menu.shareToLan"); + final TranslationTextComponent BUTTON_OPTIONS = new TranslationTextComponent("menu.options"); + final TranslationTextComponent BUTTON_EXIT_SERVER = new TranslationTextComponent("menu.disconnect"); + final TranslationTextComponent BUTTON_ADVANCEMENTS = new TranslationTextComponent("gui.advancements"); + final TranslationTextComponent BUTTON_STATS = new TranslationTextComponent("gui.stats"); + final TranslationTextComponent BUTTON_OPEN_TO_LAN = new TranslationTextComponent("menu.shareToLan"); //#else //#if MC>=11400 //$$ final String BUTTON_OPTIONS = I18n.translate("menu.options"); @@ -93,8 +93,8 @@ private void injectIntoIngameMenu(Screen guiScreen, List b //$$ GuiButton openToLan = null; //#endif //#if MC>=11400 - AbstractButtonWidget achievements = null, stats = null; - for(AbstractButtonWidget b : new ArrayList<>(buttonList)) { + Widget achievements = null, stats = null; + for(Widget b : new ArrayList<>(buttonList)) { //#else //$$ GuiButton achievements = null, stats = null; //$$ for(GuiButton b : new ArrayList<>(buttonList)) { @@ -102,7 +102,7 @@ private void injectIntoIngameMenu(Screen guiScreen, List b boolean remove = false; //#if MC>=11400 //#if MC>=11600 - Text id = b.getMessage(); + ITextComponent id = b.getMessage(); //#else //$$ String id = b.getMessage(); //#endif @@ -183,7 +183,7 @@ private void injectIntoIngameMenu(Screen guiScreen, List b */ private void moveAllButtonsInRect( //#if MC>=11400 - List buttons, + List buttons, //#else //$$ List buttons, //#endif @@ -200,8 +200,8 @@ private void moveAllButtonsInRect( } { on(InitScreenCallback.EVENT, this::ensureReplayStopped); } - private void ensureReplayStopped(Screen guiScreen, List buttonList) { - if (!(guiScreen instanceof TitleScreen || guiScreen instanceof MultiplayerScreen)) { + private void ensureReplayStopped(Screen guiScreen, List buttonList) { + if (!(guiScreen instanceof MainMenuScreen || guiScreen instanceof MultiplayerScreen)) { return; } @@ -221,8 +221,8 @@ private void ensureReplayStopped(Screen guiScreen, List bu } { on(InitScreenCallback.EVENT, this::injectIntoMainMenu); } - private void injectIntoMainMenu(Screen guiScreen, List buttonList) { - if (!(guiScreen instanceof TitleScreen)) { + private void injectIntoMainMenu(Screen guiScreen, List buttonList) { + if (!(guiScreen instanceof MainMenuScreen)) { return; } @@ -283,16 +283,16 @@ protected void layout(GuiScreen container, int width, int height) { this::onButton ); //#if FABRIC<=0 - //$$ if (isCustomMainMenuMod) { - //$$ // CustomMainMenu uses a different list in the event than in its Fake gui - //$$ buttonList.add(button); - //$$ return; - //$$ } + if (isCustomMainMenuMod) { + // CustomMainMenu uses a different list in the event than in its Fake gui + buttonList.add(button); + return; + } //#endif addButton(guiScreen, button); } - private Point determineButtonPos(MainMenuButtonPosition buttonPosition, Screen guiScreen, List buttonList) { + private Point determineButtonPos(MainMenuButtonPosition buttonPosition, Screen guiScreen, List buttonList) { Point topRight = new Point(guiScreen.width - 20 - 5, 5); if (buttonPosition == MainMenuButtonPosition.TOP_LEFT) { @@ -316,7 +316,7 @@ private Point determineButtonPos(MainMenuButtonPosition buttonPosition, Screen g && button.y + button.getHeight() >= it.y )) // then take the bottom-most and if there's two, the right-most - .max(Comparator.comparingInt(it -> it.y).thenComparingInt(it -> it.x)) + .max(Comparator.comparingInt(it -> it.y).thenComparingInt(it -> it.x)) // and place ourselves next to it .map(it -> new Point(it.x + it.getWidth() + 4, it.y)) // if all fails, just go with TOP_RIGHT @@ -367,13 +367,13 @@ private void onButton(InjectedButton button) { //#endif if(!button.active) return; - if (guiScreen instanceof TitleScreen) { + if (guiScreen instanceof MainMenuScreen) { if (button.id == BUTTON_REPLAY_VIEWER) { new GuiReplayViewer(mod).display(); } } - if (guiScreen instanceof GameMenuScreen && mod.getReplayHandler() != null) { + if (guiScreen instanceof IngameMenuScreen && mod.getReplayHandler() != null) { if (button.id == BUTTON_EXIT_REPLAY) { button.active = false; try { @@ -387,7 +387,7 @@ private void onButton(InjectedButton button) { public static class InjectedButton extends //#if MC>=11400 - ButtonWidget + Button //#else //$$ GuiButton //#endif @@ -411,7 +411,7 @@ public InjectedButton(Screen guiScreen, int buttonId, int x, int y, int width, i width, height, //#if MC>=11600 - new TranslatableText(buttonText) + new TranslationTextComponent(buttonText) //#else //$$ I18n.translate(buttonText) //#endif diff --git a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java index 0823738f..29256f43 100644 --- a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java +++ b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java @@ -23,8 +23,8 @@ import com.replaymod.simplepathing.gui.GuiPathing; import com.replaymod.simplepathing.preview.PathPreview; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashException; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.ReportedException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -156,7 +156,7 @@ private void onReplayOpened(ReplayHandler replayHandler) { } } } catch (IOException e) { - throw new CrashException(CrashReport.create(e, "Reading timeline")); + throw new ReportedException(CrashReport.makeCrashReport(e, "Reading timeline")); } guiPathing = new GuiPathing(core, this, replayHandler); @@ -275,8 +275,8 @@ private void maybeSaveTimeline(ReplayFile replayFile) { String serialized = serialization.serialize(Collections.singletonMap("", spTimeline.getTimeline())); timeline = serialization.deserialize(serialized).get(""); } catch (Throwable t) { - CrashReport report = CrashReport.create(t, "Cloning timeline"); - throw new CrashException(report); + CrashReport report = CrashReport.makeCrashReport(t, "Cloning timeline"); + throw new ReportedException(report); } int id = lastSaveId.incrementAndGet(); diff --git a/src/main/java/com/replaymod/simplepathing/SPTimeline.java b/src/main/java/com/replaymod/simplepathing/SPTimeline.java index 561122d4..35a854a4 100644 --- a/src/main/java/com/replaymod/simplepathing/SPTimeline.java +++ b/src/main/java/com/replaymod/simplepathing/SPTimeline.java @@ -28,9 +28,9 @@ import com.replaymod.replaystudio.util.EntityPositionTracker; import com.replaymod.replaystudio.util.Location; import com.replaymod.simplepathing.properties.ExplicitInterpolationProperty; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; +import net.minecraft.crash.CrashReport; +import net.minecraft.crash.CrashReportCategory; +import net.minecraft.crash.ReportedException; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.tuple.Triple; @@ -671,10 +671,10 @@ private String serializeInterpolator(Interpolator interpolator) { jsonWriter.endArray(); jsonWriter.flush(); } catch (IOException e) { - CrashReport crash = CrashReport.create(e, "Serializing interpolator"); - CrashReportSection category = crash.addElement("Serializing interpolator"); - category.add("Interpolator", interpolator::toString); - throw new CrashException(crash); + CrashReport crash = CrashReport.makeCrashReport(e, "Serializing interpolator"); + CrashReportCategory category = crash.makeCategory("Serializing interpolator"); + category.addDetail("Interpolator", interpolator::toString); + throw new ReportedException(crash); } return baos.toString(); @@ -686,10 +686,10 @@ private Interpolator deserializeInterpolator(String json) { jsonReader.beginArray(); return deserializeInterpolator(jsonReader); } catch (IOException e) { - CrashReport crash = CrashReport.create(e, "De-serializing interpolator"); - CrashReportSection category = crash.addElement("De-serializing interpolator"); - category.add("Interpolator", json::toString); - throw new CrashException(crash); + CrashReport crash = CrashReport.makeCrashReport(e, "De-serializing interpolator"); + CrashReportCategory category = crash.makeCategory("De-serializing interpolator"); + category.addDetail("Interpolator", json::toString); + throw new ReportedException(crash); } } } diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java b/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java index f80438bf..4daec25a 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java @@ -34,7 +34,7 @@ import com.replaymod.gui.utils.Colors; import com.replaymod.gui.utils.Consumer; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.resources.I18n; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -290,7 +290,7 @@ public InterpolationPanel() { setLayout(new VerticalLayout()); dropdown = new GuiDropdownMenu() - .setToString(s -> I18n.translate(s.getI18nName())) + .setToString(s -> I18n.format(s.getI18nName())) .setValues(InterpolatorType.values()).setHeight(20) .onSelection(i -> setSettingsPanel(dropdown.getSelectedValue())); diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java index 36ba169b..2decfc55 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java @@ -18,9 +18,9 @@ import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.element.advanced.AbstractGuiTimeline; import com.replaymod.gui.function.Draggable; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormats; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import org.apache.commons.lang3.tuple.Pair; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; @@ -143,10 +143,10 @@ protected void drawTimelineCursor(GuiRenderer renderer, ReadableDimension size) final int color = 0xff0000ff; Tessellator tessellator = Tessellator.getInstance(); BufferBuilder buffer = tessellator.getBuffer(); - buffer.begin(GL11.GL_LINE_STRIP, VertexFormats.POSITION_COLOR); + buffer.begin(GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION_COLOR); // Start just below the top border of the replay timeline - buffer.vertex( + buffer.pos( replayTimelineLeft + positionXReplayTimeline, replayTimelineTop + BORDER_TOP, 0 @@ -155,9 +155,9 @@ protected void drawTimelineCursor(GuiRenderer renderer, ReadableDimension size) color >> 16 & 0xff, color >> 8 & 0xff, color & 0xff - ).next(); + ).endVertex(); // Draw vertically over the replay timeline, including its bottom border - buffer.vertex( + buffer.pos( replayTimelineLeft + positionXReplayTimeline, replayTimelineBottom, 0 @@ -166,9 +166,9 @@ protected void drawTimelineCursor(GuiRenderer renderer, ReadableDimension size) color >> 16 & 0xff, color >> 8 & 0xff, color & 0xff - ).next(); + ).endVertex(); // Now for the important part: connecting to the keyframe timeline - buffer.vertex( + buffer.pos( keyframeTimelineLeft + positionXKeyframeTimeline, keyframeTimelineTop, 0 @@ -177,9 +177,9 @@ protected void drawTimelineCursor(GuiRenderer renderer, ReadableDimension size) color >> 16 & 0xff, color >> 8 & 0xff, color & 0xff - ).next(); + ).endVertex(); // And finally another vertical bit (the timeline is already crammed enough, so only the border) - buffer.vertex( + buffer.pos( keyframeTimelineLeft + positionXKeyframeTimeline, keyframeTimelineTop + BORDER_TOP, 0 @@ -188,7 +188,7 @@ protected void drawTimelineCursor(GuiRenderer renderer, ReadableDimension size) color >> 16 & 0xff, color >> 8 & 0xff, color & 0xff - ).next(); + ).endVertex(); GL11.glEnable(GL11.GL_LINE_SMOOTH); GL11.glDisable(GL11.GL_TEXTURE_2D); diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java index 25f3e734..79e9be65 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java @@ -48,8 +48,8 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.util.crash.CrashReport; +import net.minecraft.client.resources.I18n; +import net.minecraft.crash.CrashReport; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -108,7 +108,7 @@ public void run() { @Override protected void close() { super.close(); - getMinecraft().openScreen(null); + getMinecraft().displayGuiScreen(null); } }.open(); screen.display(); @@ -135,7 +135,7 @@ public GuiElement getTooltip(RenderInfo renderInfo) { label = "replaymod.gui.ingame.menu.removespeckeyframe"; } } - tooltip.setText(I18n.translate(label) + " (" + mod.keyPositionKeyframe.getBoundKey() + ")"); + tooltip.setText(I18n.format(label) + " (" + mod.keyPositionKeyframe.getBoundKey() + ")"); } return tooltip; } @@ -152,7 +152,7 @@ public GuiElement getTooltip(RenderInfo renderInfo) { } else { // Remove time keyframe label = "replaymod.gui.ingame.menu.removetimekeyframe"; } - tooltip.setText(I18n.translate(label) + " (" + mod.keyTimeKeyframe.getBoundKey() + ")"); + tooltip.setText(I18n.format(label) + " (" + mod.keyTimeKeyframe.getBoundKey() + ")"); } return tooltip; } @@ -511,7 +511,7 @@ private Timeline preparePathsForPlayback(boolean ignoreTimeKeyframes) { timeline.getPaths().forEach(Path::updateAll); return timeline; } catch (Throwable t) { - error(LOGGER, replayHandler.getOverlay(), CrashReport.create(t, "Cloning timeline"), () -> {}); + error(LOGGER, replayHandler.getOverlay(), CrashReport.makeCrashReport(t, "Cloning timeline"), () -> {}); return null; } } @@ -577,7 +577,7 @@ public void onFailure(@Nonnull Throwable t) { if (!errorShown) { String message = "Failed to load entity tracker, spectator keyframes will be broken."; GuiReplayOverlay overlay = replayHandler.getOverlay(); - Utils.error(LOGGER, overlay, CrashReport.create(t, message), () -> { + Utils.error(LOGGER, overlay, CrashReport.makeCrashReport(t, message), () -> { popup.close(); thenRun.run(); }); @@ -610,7 +610,7 @@ public void toggleKeyframe(SPPath path, boolean neverSpectator) { if (timeline.getPositionPath().getKeyframes().isEmpty() && timeline.getTimePath().getKeyframes().isEmpty() && time > 1000) { - String text = I18n.translate("replaymod.gui.ingame.first_keyframe_not_at_start_warning"); + String text = I18n.format("replaymod.gui.ingame.first_keyframe_not_at_start_warning"); GuiInfoPopup.open(overlay, text.split("\\\\n")); } @@ -644,10 +644,10 @@ public void toggleKeyframe(SPPath path, boolean neverSpectator) { CameraEntity camera = replayHandler.getCameraEntity(); int spectatedId = -1; if (!replayHandler.isCameraView() && !neverSpectator) { - spectatedId = replayHandler.getOverlay().getMinecraft().getCameraEntity().getEntityId(); + spectatedId = replayHandler.getOverlay().getMinecraft().getRenderViewEntity().getEntityId(); } - timeline.addPositionKeyframe(time, camera.getX(), camera.getY(), camera.getZ(), - camera.yaw, camera.pitch, camera.roll, spectatedId); + timeline.addPositionKeyframe(time, camera.getPosX(), camera.getPosY(), camera.getPosZ(), + camera.rotationYaw, camera.rotationPitch, camera.roll, spectatedId); mod.setSelected(path, time); } break; diff --git a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java index 566c4d0e..7fea342e 100644 --- a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java +++ b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java @@ -18,13 +18,13 @@ import com.replaymod.simplepathing.SPTimeline; import com.replaymod.simplepathing.gui.GuiPathing; import com.replaymod.gui.utils.EventRegistrations; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.Tessellator; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; +import net.minecraft.util.ResourceLocation; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import org.lwjgl.opengl.GL11; @@ -39,8 +39,8 @@ import static com.replaymod.core.ReplayMod.TEXTURE; public class PathPreviewRenderer extends EventRegistrations { - private static final Identifier CAMERA_HEAD = new Identifier("replaymod", "camera_head.png"); - private static final MinecraftClient mc = MCVer.getMinecraft(); + private static final ResourceLocation CAMERA_HEAD = new ResourceLocation("replaymod", "camera_head.png"); + private static final Minecraft mc = MCVer.getMinecraft(); private static final int SLOW_PATH_COLOR = 0xffcccc; private static final int FAST_PATH_COLOR = 0x660000; @@ -56,9 +56,9 @@ public PathPreviewRenderer(ReplayModSimplePathing mod, ReplayHandler replayHandl { on(PostRenderWorldCallback.EVENT, this::renderCameraPath); } private void renderCameraPath(MatrixStack matrixStack) { - if (!replayHandler.getReplaySender().isAsyncMode() || mc.options.hudHidden) return; + if (!replayHandler.getReplaySender().isAsyncMode() || mc.gameSettings.hideGUI) return; - Entity view = mc.getCameraEntity(); + Entity view = mc.getRenderViewEntity(); if (view == null) return; GuiPathing guiPathing = mod.getGuiPathing(); @@ -73,19 +73,19 @@ private void renderCameraPath(MatrixStack matrixStack) { path.update(); - int renderDistance = mc.options.viewDistance * 16; + int renderDistance = mc.gameSettings.renderDistanceChunks * 16; int renderDistanceSquared = renderDistance * renderDistance; Triple viewPos = Triple.of( - view.getX(), - view.getY() + view.getPosX(), + view.getPosY() //#if MC>=10800 && MC<11500 //$$ // Eye height is subtracted to make path appear higher (at eye height) than it actually is (at foot height) //$$ - view.getStandingEyeHeight(), //#else , //#endif - view.getZ() + view.getPosZ() ); GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); @@ -95,7 +95,7 @@ private void renderCameraPath(MatrixStack matrixStack) { GL11.glDisable(GL11.GL_TEXTURE_2D); //#if MC>=11500 - RenderSystem.multMatrix(matrixStack.peek().getModel()); + RenderSystem.multMatrix(matrixStack.getLast().getMatrix()); //#endif for (PathSegment segment : path.getSegments()) { @@ -217,9 +217,9 @@ private void drawConnection(Triple view, Tessellator tessellator = Tessellator.getInstance(); BufferBuilder buffer = tessellator.getBuffer(); - buffer.begin(GL11.GL_LINES, VertexFormats.POSITION_COLOR); + buffer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR); - buffer.vertex( + buffer.pos( pos1.getLeft() - view.getLeft(), pos1.getMiddle() - view.getMiddle(), pos1.getRight() - view.getRight() @@ -228,8 +228,8 @@ private void drawConnection(Triple view, color >> 8 & 0xff, color & 0xff, 255 - ).next(); - buffer.vertex( + ).endVertex(); + buffer.pos( pos2.getLeft() - view.getLeft(), pos2.getMiddle() - view.getMiddle(), pos2.getRight() - view.getRight() @@ -238,7 +238,7 @@ private void drawConnection(Triple view, color >> 8 & 0xff, color & 0xff, 255 - ).next(); + ).endVertex(); GL11.glLineWidth(3); tessellator.draw(); @@ -269,12 +269,12 @@ private void drawPoint(Triple view, Tessellator tessellator = Tessellator.getInstance(); BufferBuilder buffer = tessellator.getBuffer(); - buffer.begin(GL11.GL_QUADS, VertexFormats.POSITION_TEXTURE); + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); - buffer.vertex(minX, minY, 0).texture(posX + size, posY + size).next(); - buffer.vertex(minX, maxY, 0).texture(posX + size, posY).next(); - buffer.vertex(maxX, maxY, 0).texture(posX, posY).next(); - buffer.vertex(maxX, minY, 0).texture(posX, posY + size).next(); + buffer.pos(minX, minY, 0).tex(posX + size, posY + size).endVertex(); + buffer.pos(minX, maxY, 0).tex(posX + size, posY).endVertex(); + buffer.pos(maxX, maxY, 0).tex(posX, posY).endVertex(); + buffer.pos(maxX, minY, 0).tex(posX, posY + size).endVertex(); GL11.glPushMatrix(); @@ -284,8 +284,8 @@ private void drawPoint(Triple view, pos.getRight() - view.getRight() ); GL11.glNormal3f(0, 1, 0); - GL11.glRotatef(-mc.getEntityRenderDispatcher().camera.getYaw(), 0, 1, 0); - GL11.glRotatef(mc.getEntityRenderDispatcher().camera.getPitch(), 1, 0, 0); + GL11.glRotatef(-mc.getRenderManager().info.getYaw(), 0, 1, 0); + GL11.glRotatef(mc.getRenderManager().info.getPitch(), 1, 0, 0); tessellator.draw(); @@ -314,10 +314,10 @@ private void drawCamera(Triple view, GL11.glDisable(GL11.GL_TEXTURE_2D); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder buffer = tessellator.getBuffer(); - buffer.begin(GL11.GL_LINES, VertexFormats.POSITION_COLOR); + buffer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR); - buffer.vertex(0, 0, 0).color(0, 255, 0, 170).next(); - buffer.vertex(0, 0, 2).color(0, 255, 0, 170).next(); + buffer.pos(0, 0, 0).color(0, 255, 0, 170).endVertex(); + buffer.pos(0, 0, 2).color(0, 255, 0, 170).endVertex(); tessellator.draw(); @@ -328,43 +328,43 @@ private void drawCamera(Triple view, double r = -cubeSize/2; - buffer.begin(GL11.GL_QUADS, VertexFormats.POSITION_TEXTURE_COLOR); + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR); //back - buffer.vertex(r, r + cubeSize, r).texture(3 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r).texture(4*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r, r).texture(4*8/64f, 2*8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r).texture(3*8/64f, 2*8/64f).color(255, 255, 255, 200).next(); + buffer.pos(r, r + cubeSize, r).tex(3 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r).tex(4*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r, r).tex(4*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r).tex(3*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); //front - buffer.vertex(r + cubeSize, r, r + cubeSize).texture(2 * 8 / 64f, 2*8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r + cubeSize).texture(2 * 8 / 64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r + cubeSize, r + cubeSize).texture(8 / 64f, 8 / 64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r + cubeSize).texture(8 / 64f, 2*8/64f).color(255, 255, 255, 200).next(); + buffer.pos(r + cubeSize, r, r + cubeSize).tex(2 * 8 / 64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2 * 8 / 64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r + cubeSize, r + cubeSize).tex(8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r + cubeSize).tex(8 / 64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); //left - buffer.vertex(r + cubeSize, r + cubeSize, r).texture(0, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r + cubeSize).texture(8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r, r + cubeSize).texture(8/64f, 2*8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r+cubeSize, r, r).texture(0, 2*8/64f).color(255, 255, 255, 200).next(); + buffer.pos(r + cubeSize, r + cubeSize, r).tex(0, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r, r + cubeSize).tex(8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r+cubeSize, r, r).tex(0, 2*8/64f).color(255, 255, 255, 200).endVertex(); //right - buffer.vertex(r, r + cubeSize, r + cubeSize).texture(2*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r + cubeSize, r).texture(3*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r).texture(3*8/64f, 2*8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r + cubeSize).texture(2 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).next(); + buffer.pos(r, r + cubeSize, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r + cubeSize, r).tex(3*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r).tex(3*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r + cubeSize).tex(2 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); //bottom - buffer.vertex(r + cubeSize, r, r).texture(3*8/64f, 0).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r, r + cubeSize).texture(3*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r + cubeSize).texture(2*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r).texture(2 * 8 / 64f, 0).color(255, 255, 255, 200).next(); + buffer.pos(r + cubeSize, r, r).tex(3*8/64f, 0).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r, r + cubeSize).tex(3*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r).tex(2 * 8 / 64f, 0).color(255, 255, 255, 200).endVertex(); //top - buffer.vertex(r, r + cubeSize, r).texture(8/64f, 0).color(255, 255, 255, 200).next(); - buffer.vertex(r, r + cubeSize, r + cubeSize).texture(8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r + cubeSize).texture(2*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r).texture(2 * 8 / 64f, 0).color(255, 255, 255, 200).next(); + buffer.pos(r, r + cubeSize, r).tex(8/64f, 0).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r + cubeSize, r + cubeSize).tex(8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r).tex(2 * 8 / 64f, 0).color(255, 255, 255, 200).endVertex(); tessellator.draw(); diff --git a/src/main/resources/assets/replaymod/.DS_Store b/src/main/resources/assets/replaymod/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0=1 - "Mixin_HideDynamicResourcePacks", - "Mixin_RegisterDynamicResourcePacks", + //$$ "Mixin_HideDynamicResourcePacks", + //$$ "Mixin_RegisterDynamicResourcePacks", //#endif //#endif //#if MC>=11400 diff --git a/src/main/resources/mixins.jgui.json b/src/main/resources/mixins.jgui.json index 55cc8659..af54d9e0 100644 --- a/src/main/resources/mixins.jgui.json +++ b/src/main/resources/mixins.jgui.json @@ -6,13 +6,13 @@ "client": [ //#if FABRIC>=1 //#if MC>=11400 - "com.replaymod.gui.versions.mixin.Mixin_RenderHudCallback", - "com.replaymod.gui.versions.mixin.MixinGameRenderer", - "com.replaymod.gui.versions.mixin.MixinScreen", - "com.replaymod.gui.versions.mixin.MixinMouseListener", - "com.replaymod.gui.versions.mixin.MixinKeyboardListener", - // Note: MixinMinecraft actually belongs one line down in the 1.13 part but see its source file for why it isn't - "com.replaymod.gui.versions.mixin.MixinMinecraft" + //$$ "com.replaymod.gui.versions.mixin.Mixin_RenderHudCallback", + //$$ "com.replaymod.gui.versions.mixin.MixinGameRenderer", + //$$ "com.replaymod.gui.versions.mixin.MixinScreen", + //$$ "com.replaymod.gui.versions.mixin.MixinMouseListener", + //$$ "com.replaymod.gui.versions.mixin.MixinKeyboardListener", + //$$ // Note: MixinMinecraft actually belongs one line down in the 1.13 part but see its source file for why it isn't + //$$ "com.replaymod.gui.versions.mixin.MixinMinecraft" //#endif //#endif ], diff --git a/src/test/java/com/replaymod/simplepathing/SPTimelineTest.java b/src/test/java/com/replaymod/simplepathing/SPTimelineTest.java deleted file mode 100644 index 36f0806f..00000000 --- a/src/test/java/com/replaymod/simplepathing/SPTimelineTest.java +++ /dev/null @@ -1,647 +0,0 @@ -package com.replaymod.simplepathing; - -import com.google.common.collect.Iterables; -import com.replaymod.pathing.properties.CameraProperties; -import com.replaymod.pathing.properties.SpectatorProperty; -import com.replaymod.pathing.properties.TimestampProperty; -import com.replaymod.replaystudio.pathing.change.Change; -import com.replaymod.replaystudio.pathing.interpolation.CatmullRomSplineInterpolator; -import com.replaymod.replaystudio.pathing.interpolation.Interpolator; -import com.replaymod.replaystudio.pathing.interpolation.LinearInterpolator; -import com.replaymod.replaystudio.pathing.path.Keyframe; -import com.replaymod.replaystudio.pathing.path.Path; -import com.replaymod.replaystudio.pathing.path.PathSegment; -import com.replaymod.replaystudio.pathing.path.Timeline; -import com.replaymod.replaystudio.util.EntityPositionTracker; -import com.replaymod.replaystudio.util.Location; -import com.replaymod.simplepathing.SPTimeline.SPPath; -import org.apache.commons.lang3.tuple.Triple; -import org.apache.logging.log4j.LogManager; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.Collections; -import java.util.Comparator; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; - -public class SPTimelineTest { - private SPTimeline impl; - private Timeline timeline; - - @BeforeClass - public static void setupLogger() { - ReplayModSimplePathing.LOGGER = LogManager.getLogger(); - } - - @Before - public void setup() { - impl = new SPTimeline(); - impl.setDefaultInterpolatorType(InterpolatorType.CUBIC); - impl.setEntityTracker(new EntityPositionTrackerMock()); - timeline = impl.getTimeline(); - } - - @Test - public void testGetPath() { - assertSame(impl.getTimeline().getPaths().get(0), impl.getTimePath()); - assertSame(impl.getTimeline().getPaths().get(0), impl.getPath(SPPath.TIME)); - assertSame(impl.getTimeline().getPaths().get(1), impl.getPositionPath()); - assertSame(impl.getTimeline().getPaths().get(1), impl.getPath(SPPath.POSITION)); - } - - @Test - public void testGetKeyframe() { - assertSame(timeline.getPaths().get(0).insert(123), impl.getKeyframe(SPPath.TIME, 123)); - assertSame(timeline.getPaths().get(1).insert(456), impl.getKeyframe(SPPath.POSITION, 456)); - } - - @Test - public void testIsTimeKeyframe() { - impl.getTimePath().insert(123); - impl.getPositionPath().insert(456); - impl.getPositionPath().insert(42).setValue(SpectatorProperty.PROPERTY, 42); - assertTrue(impl.isTimeKeyframe(123)); - assertFalse(impl.isTimeKeyframe(456)); - assertFalse(impl.isTimeKeyframe(789)); - assertFalse(impl.isTimeKeyframe(42)); - } - - @Test - public void testIsPositionKeyframe() { - impl.getTimePath().insert(123); - impl.getPositionPath().insert(456); - impl.getPositionPath().insert(42).setValue(SpectatorProperty.PROPERTY, 42); - assertFalse(impl.isPositionKeyframe(123)); - assertTrue(impl.isPositionKeyframe(456)); - assertFalse(impl.isPositionKeyframe(789)); - assertTrue(impl.isSpectatorKeyframe(42)); - } - - @Test - public void testIsSpectatorKeyframe() { - impl.getTimePath().insert(123); - impl.getPositionPath().insert(456); - impl.getPositionPath().insert(42).setValue(SpectatorProperty.PROPERTY, 42); - assertFalse(impl.isSpectatorKeyframe(123)); - assertFalse(impl.isSpectatorKeyframe(456)); - assertFalse(impl.isSpectatorKeyframe(789)); - assertTrue(impl.isSpectatorKeyframe(42)); - } - - @Test - public void testAddPositionKeyframe() { - assertNull(timeline.peekUndoStack()); - impl.addPositionKeyframe(0, 1, 2, 3, 4, 5, 6, -1); - assertNotNull(timeline.peekUndoStack()); - Keyframe keyframe = impl.getKeyframe(SPPath.POSITION, 0); - assertNotNull(keyframe); - assertEquals(keyframe.getValue(CameraProperties.POSITION), Optional.of(Triple.of(1d, 2d, 3d))); - assertEquals(keyframe.getValue(CameraProperties.ROTATION), Optional.of(Triple.of(4f, 5f, 6f))); - assertFalse(keyframe.getValue(SpectatorProperty.PROPERTY).isPresent()); - timeline.undoLastChange(); - assertNull(timeline.peekUndoStack()); - assertNull(impl.getKeyframe(SPPath.POSITION, 0)); - } - - @Test - public void testAddPositionKeyframeSpectator() { - assertNull(timeline.peekUndoStack()); - impl.addPositionKeyframe(0, 1, 2, 3, 4, 5, 6, 7); - assertNotNull(timeline.peekUndoStack()); - Keyframe keyframe = impl.getKeyframe(SPPath.POSITION, 0); - assertNotNull(keyframe); - assertEquals(keyframe.getValue(CameraProperties.POSITION), Optional.of(Triple.of(1d, 2d, 3d))); - assertEquals(keyframe.getValue(CameraProperties.ROTATION), Optional.of(Triple.of(4f, 5f, 6f))); - assertEquals(keyframe.getValue(SpectatorProperty.PROPERTY), Optional.of(7)); - timeline.undoLastChange(); - assertNull(timeline.peekUndoStack()); - assertNull(impl.getKeyframe(SPPath.POSITION, 0)); - } - - @Test - public void testPositionKeyframeSpectatorPosition() { - Keyframe keyframe; - impl.addTimeKeyframe(0, 0); - impl.addTimeKeyframe(9, 9); - - impl.addPositionKeyframe(4, 1, 2, 3, 4, 5, 6, 1); - keyframe = impl.getKeyframe(SPPath.POSITION, 4); - assertEquals(keyframe.getValue(CameraProperties.POSITION), Optional.of(Triple.of(1d, 2d, 3d))); - assertEquals(keyframe.getValue(CameraProperties.ROTATION), Optional.of(Triple.of(4f, 5f, 6f))); - - impl.addPositionKeyframe(6, 1, 2, 3, 4, 5, 6, 42); - keyframe = impl.getKeyframe(SPPath.POSITION, 6); - assertEquals(keyframe.getValue(CameraProperties.POSITION), Optional.of(Triple.of(12d, 0d, 0d))); - assertEquals(keyframe.getValue(CameraProperties.ROTATION), Optional.of(Triple.of(0f, 0f, 0f))); - - impl.addPositionKeyframe(8, 1, 2, 3, 4, 5, 6, 42); - keyframe = impl.getKeyframe(SPPath.POSITION, 8); - assertEquals(keyframe.getValue(CameraProperties.POSITION), Optional.of(Triple.of(16d, 0d, 0d))); - assertEquals(keyframe.getValue(CameraProperties.ROTATION), Optional.of(Triple.of(0f, 0f, 0f))); - - impl.addPositionKeyframe(10, 1, 2, 3, 4, 5, 6, 42); - keyframe = impl.getKeyframe(SPPath.POSITION, 10); - assertEquals(keyframe.getValue(CameraProperties.POSITION), Optional.of(Triple.of(1d, 2d, 3d))); - assertEquals(keyframe.getValue(CameraProperties.ROTATION), Optional.of(Triple.of(4f, 5f, 6f))); - } - - @Test(expected = IllegalStateException.class) - public void testAddPositionKeyframeDuplicate() { - impl.addPositionKeyframe(0, 1, 2, 3, 4, 5, 6, -1); - impl.addPositionKeyframe(0, 1, 2, 3, 4, 5, 6, -1); - } - - @Test - public void testUpdatePositionKeyframe() { - impl.addPositionKeyframe(0, 1, 2, 3, 4, 5, 6, -1); - Change change = impl.updatePositionKeyframe(0, 7, 8, 9, 10, 11, 12); - assertNotNull(change); - Keyframe keyframe = impl.getKeyframe(SPPath.POSITION, 0); - assertEquals(keyframe.getValue(CameraProperties.POSITION), Optional.of(Triple.of(7d, 8d, 9d))); - assertEquals(keyframe.getValue(CameraProperties.ROTATION), Optional.of(Triple.of(10f, 11f, 12f))); - assertFalse(keyframe.getValue(SpectatorProperty.PROPERTY).isPresent()); - change.undo(timeline); - keyframe = impl.getKeyframe(SPPath.POSITION, 0); - assertEquals(keyframe.getValue(CameraProperties.POSITION), Optional.of(Triple.of(1d, 2d, 3d))); - assertEquals(keyframe.getValue(CameraProperties.ROTATION), Optional.of(Triple.of(4f, 5f, 6f))); - assertFalse(keyframe.getValue(SpectatorProperty.PROPERTY).isPresent()); - } - - @Test(expected = IllegalStateException.class) - public void testUpdatePositionKeyframeNoKeyframe() { - impl.updatePositionKeyframe(0, 1, 2, 3, 4, 5, 6); - } - - @Test(expected = IllegalStateException.class) - public void testUpdatePositionKeyframeSpectatorKeyframe() { - impl.addPositionKeyframe(0, 1, 2, 3, 4, 5, 6, 7); - impl.updatePositionKeyframe(0, 1, 2, 3, 4, 5, 6); - } - - @Test - public void testRemovePositionKeyframe() { - impl.addPositionKeyframe(0, 1, 2, 3, 4, 5, 6, -1); - impl.removePositionKeyframe(0); - assertNull(impl.getKeyframe(SPPath.POSITION, 0)); - } - - @Test(expected = IllegalStateException.class) - public void testRemovePositionKeyframeNoKeyframe() { - impl.removePositionKeyframe(0); - } - - @Test - public void testAddTimeKeyframe() { - assertNull(timeline.peekUndoStack()); - impl.addTimeKeyframe(0, 1); - assertNotNull(timeline.peekUndoStack()); - Keyframe keyframe = impl.getKeyframe(SPPath.TIME, 0); - assertNotNull(keyframe); - assertEquals(keyframe.getValue(TimestampProperty.PROPERTY), Optional.of(1)); - timeline.undoLastChange(); - assertNull(timeline.peekUndoStack()); - assertNull(impl.getKeyframe(SPPath.TIME, 0)); - } - - @Test(expected = IllegalStateException.class) - public void testAddTimeKeyframeDuplicate() { - impl.addTimeKeyframe(0, 1); - impl.addTimeKeyframe(0, 1); - } - - @Test - public void testUpdateTimeKeyframe() { - impl.addTimeKeyframe(0, 1); - Change change = impl.updateTimeKeyframe(0, 2); - assertNotNull(change); - assertEquals(impl.getKeyframe(SPPath.TIME, 0).getValue(TimestampProperty.PROPERTY), Optional.of(2)); - change.undo(timeline); - assertEquals(impl.getKeyframe(SPPath.TIME, 0).getValue(TimestampProperty.PROPERTY), Optional.of(1)); - } - - @Test(expected = IllegalStateException.class) - public void testUpdateTimeKeyframeNoKeyframe() { - impl.updateTimeKeyframe(0, 1); - } - - @Test - public void testRemoveTimeKeyframe() { - impl.addTimeKeyframe(0, 1); - impl.removeTimeKeyframe(0); - assertNull(impl.getKeyframe(SPPath.TIME, 0)); - } - - @Test(expected = IllegalStateException.class) - public void testRemoveTimeKeyframeNoKeyframe() { - impl.removeTimeKeyframe(0); - } - - /** - * Checks all interpolators to make sure that they are continuous and not fragmented. - */ - private void assertValidInterpolators(SPPath path, int expectedNumberOfInterpolators) { - String str = prettyPrintInterpolators(impl, path); - List interpolators = impl.getPath(path).getSegments().stream().map(PathSegment::getInterpolator) - .distinct().collect(Collectors.toList()); - assertFalse("Not all interpolators set: " + str, interpolators.contains(null)); - assertEquals("Mismatched interpolator number: " + str, expectedNumberOfInterpolators, interpolators.size()); - int i = 0; - for (Interpolator interpolator : interpolators) { - Keyframe lastKeyframe = null; - for (PathSegment segment : interpolator.getSegments().stream() - .sorted(Comparator.comparing(s -> s.getStartKeyframe().getTime())).collect(Collectors.toList())) { - String message = "Fragmentation in interpolator " + i + ": " + str; - assertTrue(message, lastKeyframe == null || segment.getStartKeyframe() == lastKeyframe); - lastKeyframe = segment.getEndKeyframe(); - } - i++; - } - } - - @Test - public void testAddPositionKeyframeAppend() { - addPosition(0, 0); - addPosition(1, 1); - addPosition(2, 1); - addPosition(3, 1); - addPosition(4, 1); - } - - @Test - public void testAddPositionKeyframePrepend() { - addPosition(4, 0); - addPosition(3, 1); - addPosition(2, 1); - addPosition(1, 1); - addPosition(0, 1); - } - - @Test - public void testAddPositionKeyframeMixed() { - addPosition(2, 0); - addPosition(4, 1); - addPosition(3, 1); - addPosition(0, 1); - addPosition(1, 1); - } - - @Test - public void testAddPositionSpectatorKeyframe() { - addPosition(0, 0); - addSpectator(1, 1); - addSpectator(2, 2); - addPosition(4, 3); - addPosition(7, 3); - addPosition(8, 3); - addSpectator(3, 3); - addSpectator(5, 3); - addSpectator(6, 5); - } - - @Test - public void testRemovePositionKeyframeFromStart() { - addPosition(0, 0); - addPosition(1, 1); - addPosition(2, 1); - addPosition(3, 1); - removePosition(0, 1); - removePosition(1, 1); - removePosition(2, 0); - removePosition(3, 0); - } - - @Test - public void testRemovePositionKeyframeFromEnd() { - addPosition(0, 0); - addPosition(1, 1); - addPosition(2, 1); - addPosition(3, 1); - removePosition(3, 1); - removePosition(2, 1); - removePosition(1, 0); - removePosition(0, 0); - } - - @Test - public void testRemovePositionKeyframeFromMiddle() { - addPosition(0, 0); - addPosition(1, 1); - addPosition(2, 1); - addPosition(3, 1); - removePosition(1, 1); - removePosition(2, 1); - removePosition(0, 0); - removePosition(3, 0); - } - - @Test - public void testRemovePositionSpectatorKeyframe() { - addPosition(0, 0); - addPosition(1, 1); - addPosition(2, 1); - addSpectator(3, 1); - addSpectator(4, 2); - addSpectator(5, 2); - addPosition(6, 3); - addPosition(7, 3); - addSpectator(8, 3); - addSpectator(9, 4); - removePosition(4, 4); - removePosition(9, 3); - removePosition(6, 3); - removePosition(7, 2); - removePosition(0, 2); - removePosition(1, 2); - removePosition(3, 2); - removePosition(2, 1); - removePosition(5, 0); - removePosition(8, 0); - } - - @Test - public void testAddTimeKeyframeAppend() { - addTime(0, 0); - addTime(1, 1); - addTime(2, 1); - addTime(3, 1); - addTime(4, 1); - } - - @Test - public void testAddTimeKeyframePrepend() { - addTime(4, 0); - addTime(3, 1); - addTime(2, 1); - addTime(1, 1); - addTime(0, 1); - } - - @Test - public void testAddTimeKeyframeMixed() { - addTime(2, 0); - addTime(4, 1); - addTime(3, 1); - addTime(0, 1); - addTime(1, 1); - } - - @Test - public void testRemoveTimeKeyframeFromStart() { - addTime(0, 0); - addTime(1, 1); - addTime(2, 1); - addTime(3, 1); - removeTime(0, 1); - removeTime(1, 1); - removeTime(2, 0); - removeTime(3, 0); - } - - @Test - public void testRemoveTimeKeyframeFromEnd() { - addTime(0, 0); - addTime(1, 1); - addTime(2, 1); - addTime(3, 1); - removeTime(3, 1); - removeTime(2, 1); - removeTime(1, 0); - removeTime(0, 0); - } - - @Test - public void testRemoveTimeKeyframeFromMiddle() { - addTime(0, 0); - addTime(1, 1); - addTime(2, 1); - addTime(3, 1); - removeTime(1, 1); - removeTime(2, 1); - removeTime(0, 0); - removeTime(3, 0); - } - - @Test - public void testSetInterpolator() { - addPosition(0, 0); - addPosition(1, 1); - addPosition(2, 1); - setInterpolator(1, new LinearInterpolator(), 2); - assertIsLinear(1); - Interpolator interpolator = Iterables.get(impl.getPositionPath().getSegments(), 1).getInterpolator(); - assertTrue(interpolator.getKeyframeProperties().contains(CameraProperties.POSITION)); - assertTrue(interpolator.getKeyframeProperties().contains(CameraProperties.ROTATION)); - addPosition(3, 3); - addPosition(4, 3); - addPosition(5, 3); - setInterpolator(3, new LinearInterpolator(), 5); - assertIsLinear(3); - removePosition(2, 3); - removePosition(3, 3); - removePosition(0, 2); - removePosition(1, 1); - removePosition(4, 0); - removePosition(5, 0); - } - - private void assertIsLinear(int index) { - assertTrue("Expected segment " + index + " to have linear interpolator: " + prettyPrintInterpolators(impl, SPPath.POSITION), - Iterables.get(impl.getPositionPath().getSegments(), index).getInterpolator() instanceof LinearInterpolator); - } - - @Test(expected = IllegalStateException.class) - public void testSetInterpolatorNoKeyframe() { - addTime(0, 0); - impl.setInterpolator(0, new LinearInterpolator()); - } - - @Test(expected = IllegalStateException.class) - public void testSetInterpolatorToDefaultNoKeyframe() { - addTime(0, 0); - impl.setInterpolatorToDefault(0); - } - - @Test - public void testMoveKeyframeSimple() { - addPosition(0, 0); - addPosition(1, 1); - setInterpolator(0, new LinearInterpolator(), 1); - assertIsLinear(0); - - impl.moveKeyframe(SPPath.POSITION, 0, 2); - assertValidInterpolators(SPPath.POSITION, 1); - assertIsLinear(0); - impl.moveKeyframe(SPPath.POSITION, 2, 0); - assertValidInterpolators(SPPath.POSITION, 1); - assertIsLinear(0); - - addPosition(2, 1); - impl.moveKeyframe(SPPath.POSITION, 0, 3); - assertValidInterpolators(SPPath.POSITION, 1); - assertIsLinear(0); - assertIsLinear(1); - } - - @Test - public void testMoveKeyframe() { - addPosition(1, 0); - addPosition(3, 1); - addPosition(5, 1); - addPosition(7, 1); - addSpectator(9, 1); - addSpectator(11, 2); - addSpectator(13, 2); - addPosition(15, 3); - addPosition(17, 3); - addPosition(19, 3); - setInterpolator(3, new LinearInterpolator(), 5); - assertIsLinear(1); - setInterpolator(5, new LinearInterpolator(), 5); - assertIsLinear(2); - // [P 1] C0 [P 3] L1 [P 5] L1 [P 7] C2 [S 9] L3 [S 11] L3 [S 13] C4 [P 15] C4 [P 17] C4 [P 19] - - impl.moveKeyframe(SPPath.POSITION, 5, 0); - assertValidInterpolators(SPPath.POSITION, 6); - assertIsLinear(0); - impl.moveKeyframe(SPPath.POSITION, 0, 5); - assertValidInterpolators(SPPath.POSITION, 5); - assertIsLinear(2); - - impl.moveKeyframe(SPPath.POSITION, 3, 12); - assertValidInterpolators(SPPath.POSITION, 7); - assertIsLinear(5); - impl.moveKeyframe(SPPath.POSITION, 12, 3); - assertValidInterpolators(SPPath.POSITION, 5); - assertIsLinear(1); - - impl.moveKeyframe(SPPath.POSITION, 7, 14); - assertValidInterpolators(SPPath.POSITION, 4); - impl.moveKeyframe(SPPath.POSITION, 14, 20); - assertValidInterpolators(SPPath.POSITION, 4); - } - - @Test(expected = IllegalArgumentException.class) - public void testSetDefaultInterpolatorDifferentType() { - addPosition(0, 0); - addPosition(1, 1); - impl.setDefaultInterpolator(new CatmullRomSplineInterpolator(42)); - } - - @Test - public void testSetDefaultInterpolatorSameType() { - impl.setDefaultInterpolatorType(InterpolatorType.CATMULL_ROM); - addPosition(0, 0); - addSpectator(1, 1); - addSpectator(2, 2); - addPosition(3, 3); - addPosition(4, 3); - impl.setDefaultInterpolator(new CatmullRomSplineInterpolator(42)); - assertValidInterpolators(SPPath.POSITION, 3); - assertIsCatmullRom(0, 42); - assertIsCatmullRom(2, 42); - assertIsCatmullRom(3, 42); - } - - private void assertIsCatmullRom(int index, double alpha) { - String str = prettyPrintInterpolators(impl, SPPath.POSITION); - Interpolator interpolator = Iterables.get(impl.getPositionPath().getSegments(), index).getInterpolator(); - assertTrue("Expected segment " + index + " to be catmull rom interpolator: " + str, - interpolator instanceof CatmullRomSplineInterpolator); - assertTrue("Expected interpolator of segment segment " + index + " to have alpha " + alpha + ": " + str, - ((CatmullRomSplineInterpolator) interpolator).getAlpha() == 42); - } - - private void addPosition(int time, int expectedNumberOfInterpolators) { - impl.addPositionKeyframe(time, 1, 2, 3, 4, 5, 6, -1); - assertNotNull(impl.getKeyframe(SPPath.POSITION, time)); - assertValidInterpolators(SPPath.POSITION, expectedNumberOfInterpolators); - } - - private void addSpectator(int time, int expectedNumberOfInterpolators) { - impl.addPositionKeyframe(time, 1, 2, 3, 4, 5, 6, 42); - assertNotNull(impl.getKeyframe(SPPath.POSITION, time)); - assertTrue(impl.isSpectatorKeyframe(time)); - assertValidInterpolators(SPPath.POSITION, expectedNumberOfInterpolators); - } - - private void addTime(int time, int expectedNumberOfInterpolators) { - impl.addTimeKeyframe(time, 1); - assertNotNull(impl.getKeyframe(SPPath.TIME, time)); - assertValidInterpolators(SPPath.TIME, expectedNumberOfInterpolators); - } - - private void removePosition(int time, int expectedNumberOfInterpolators) { - impl.removePositionKeyframe(time); - assertNull(impl.getKeyframe(SPPath.POSITION, time)); - assertValidInterpolators(SPPath.POSITION, expectedNumberOfInterpolators); - } - - private void removeTime(int time, int expectedNumberOfInterpolators) { - impl.removeTimeKeyframe(time); - assertNull(impl.getKeyframe(SPPath.TIME, time)); - assertValidInterpolators(SPPath.TIME, expectedNumberOfInterpolators); - } - - private void setInterpolator(int time, Interpolator interpolator, int expectedNumberOfInterpolators) { - impl.setInterpolator(time, interpolator); - assertValidInterpolators(SPPath.POSITION, expectedNumberOfInterpolators); - } - - private void assertPositionState(String expected) { - assertEquals(expected, prettyPrintInterpolators(impl, SPPath.POSITION)); - } - - // Tracks only entity 42 which always is at x=time*2, y,z=0 - private class EntityPositionTrackerMock extends EntityPositionTracker { - public EntityPositionTrackerMock() { - super(null); - } - - @Override - public Location getEntityPositionAtTimestamp(int entityID, long timestamp) { - if (entityID == 42) { - return new Location(timestamp * 2, 0 ,0, 0, 0); - } else { - return null; - } - } - } - - public static String prettyPrintInterpolators(SPTimeline timeline, SPPath spPath) { - return prettyPrintInterpolators(timeline, spPath, Collections.emptyMap()); - } - - public static String prettyPrintInterpolators(SPTimeline timeline, SPPath spPath, Map updates) { - Map interpolatorIdMap = new IdentityHashMap<>(); - Path path = timeline.getPath(spPath); - StringBuilder sb = new StringBuilder(); - for (Keyframe keyframe : path.getKeyframes()) { - if (spPath == SPPath.TIME) { - sb.append("[T ").append(keyframe.getTime()).append("]"); - } else if (keyframe.getValue(SpectatorProperty.PROPERTY).isPresent()) { - sb.append("[S ").append(keyframe.getTime()).append("]"); - } else { - sb.append("[P ").append(keyframe.getTime()).append("]"); - } - path.getSegments().stream().filter(s -> s.getStartKeyframe() == keyframe).findFirst().ifPresent(segment -> { - Interpolator interpolator = updates.getOrDefault(segment, segment.getInterpolator()); - String id = interpolatorIdMap.computeIfAbsent(interpolator, i -> - (i instanceof LinearInterpolator ? "L" : "C") + interpolatorIdMap.size()); - sb.append(' ').append(id).append(' '); - }); - } - return sb.toString(); - } -} From 66310a28c40b4e517a444f84e1fc85f66551ddd2 Mon Sep 17 00:00:00 2001 From: Yuji Ueki Date: Sat, 23 Jan 2021 22:27:04 +0900 Subject: [PATCH 3/5] :shower: Remove versions folder --- versions/1.10.2/.gitkeep | 0 versions/1.11.2/.gitkeep | 0 versions/1.11.2/mapping.txt | 0 .../replaymod/core/utils/ModInfoGetter.java | 29 -- versions/1.11/.gitkeep | 0 versions/1.11/mapping.txt | 0 versions/1.12.1/.gitkeep | 0 versions/1.12.2/.gitkeep | 0 .../DisableBetterSprinting.java | 183 --------- .../mapwriter/mixin/MixinMinecraft.java | 44 --- .../HideInvisibleEntities.java | 29 -- .../com/replaymod/core/LoadingPlugin.java | 102 ----- .../com/replaymod/core/ReplayModBackend.java | 96 ----- .../core/SettingsRegistryBackend.java | 75 ---- .../com/replaymod/core/gui/GuiFactory.java | 61 --- .../core/mixin/MixinKeyboardListener.java | 27 -- .../core/tweaker/ReplayModTweaker.java | 120 ------ .../replaymod/core/utils/ModInfoGetter.java | 29 -- .../com/replaymod/core/versions/GLFW.java | 9 - .../com/replaymod/core/versions/Window.java | 69 ---- .../core/versions/forge/EventsAdapter.java | 70 ---- .../core/versions/forge/Patterns.java | 57 --- .../versions/scheduler/SchedulerImpl.java | 142 ------- .../recording/handler/FMLHandshakeFilter.java | 29 -- .../mixin/MixinNetHandlerLoginClient.java | 37 -- .../mixin/MixinNetworkDispatcher.java | 69 ---- .../mixin/MixinPlayerControllerMP.java | 33 -- .../render/mixin/MainWindowAccessor.java | 17 - .../mixin/Mixin_ChromaKeyDisableFog.java | 19 - .../mixin/Mixin_Omnidirectional_Camera.java | 40 -- .../Mixin_Stereoscopic_HandRenderPass.java | 29 -- .../replay/mixin/MixinRenderManager.java | 30 -- .../replay/mixin/MixinWorldClient.java | 31 -- versions/1.12/.gitkeep | 0 versions/1.12/mapping.txt | 1 - versions/1.13.2/.gitkeep | 0 versions/1.14.4-forge/mapping.txt | 369 ------------------ .../com/replaymod/core/ReplayModBackend.java | 20 - .../replaymod/core/utils/ModInfoGetter.java | 11 - versions/1.14.4/.gitkeep | 0 .../render/hooks/ForceChunkLoadingHook.java | 131 ------- .../mixin/ChunkRenderDispatcherAccessor.java | 34 -- .../render/mixin/MixinChunkRenderWorker.java | 18 - .../render/mixin/Mixin_ForceChunkLoading.java | 131 ------- .../mixin/Mixin_Omnidirectional_Camera.java | 34 -- .../mixin/Mixin_Stereoscopic_Camera.java | 43 -- .../replaymod/replay/mixin/MixinCamera.java | 30 -- versions/1.15.2/.gitkeep | 0 versions/1.16.1/.gitkeep | 0 versions/1.16.4-forge/.gitkeep | 0 .../com/replaymod/core/ReplayModBackend.java | 56 --- .../core/tweaker/ReplayModTweaker.java | 122 ------ .../replaymod/core/utils/ModInfoGetter.java | 23 -- .../core/versions/forge/EventsAdapter.java | 65 --- .../gui/versions/forge/EventsAdapter.java | 89 ----- .../mixin/MixinClientPlayNetHandler.java | 45 --- .../mixin/MixinFMLHandshakeHandler.java | 41 -- .../mixin/MixinNetHandlerLoginClient.java | 47 --- .../mixin/NetworkRegistryAccessor.java | 16 - versions/1.16.4/.gitkeep | 0 versions/1.7.10/.gitkeep | 0 .../compat/shaders/mixin/MixinShaders.java | 52 --- .../core/asm/GLErrorTransformer.java | 93 ----- .../core/asm/GLStateTrackerTransformer.java | 104 ----- .../mixin/ResourcePackRepositoryAccessor.java | 20 - .../replaymod/core/utils/ModInfoGetter.java | 32 -- .../core/versions/BufferBuilder.java | 30 -- .../recording/mixin/MixinGuiScreen.java | 42 -- .../mixin/MixinS26PacketMapChunkBulk.java | 36 -- .../render/hooks/ForceChunkLoadingHook.java | 17 - .../render/hooks/GLStateTracker.java | 44 --- .../render/mixin/MixinOpenGlHelper.java | 16 - .../render/mixin/Mixin_ForceChunkLoading.java | 27 -- .../replay/mixin/MixinEntityRenderer.java | 26 -- .../replay/mixin/MixinFMLClientHandler.java | 27 -- versions/1.8.9/.gitkeep | 0 versions/1.8.9/mapping.txt | 20 - .../mixin/MixinPlayerControllerMP.java | 1 - .../render/mixin/MixinEffectRenderer.java | 101 ----- .../Mixin_HideNameTags_LivingEntity.java | 21 - versions/1.8/.gitkeep | 0 versions/1.8/mapping.txt | 40 -- versions/1.9.4/.gitkeep | 0 versions/1.9.4/mapping.txt | 66 ---- versions/core/.gitkeep | 0 versions/mainProject | 1 - versions/mapping-1.16.4-fabric-forge.txt | 6 - versions/mapping-fabric-1.15.2-1.14.4.txt | 15 - 88 files changed, 3639 deletions(-) delete mode 100644 versions/1.10.2/.gitkeep delete mode 100644 versions/1.11.2/.gitkeep delete mode 100644 versions/1.11.2/mapping.txt delete mode 100644 versions/1.11.2/src/main/java/com/replaymod/core/utils/ModInfoGetter.java delete mode 100644 versions/1.11/.gitkeep delete mode 100644 versions/1.11/mapping.txt delete mode 100644 versions/1.12.1/.gitkeep delete mode 100644 versions/1.12.2/.gitkeep delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/LoadingPlugin.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/ReplayModBackend.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/SettingsRegistryBackend.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/gui/GuiFactory.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/mixin/MixinKeyboardListener.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/utils/ModInfoGetter.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/versions/GLFW.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/versions/Window.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/Patterns.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinPlayerControllerMP.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/render/mixin/MainWindowAccessor.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_ChromaKeyDisableFog.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java delete mode 100644 versions/1.12.2/src/main/java/com/replaymod/replay/mixin/MixinWorldClient.java delete mode 100644 versions/1.12/.gitkeep delete mode 100644 versions/1.12/mapping.txt delete mode 100644 versions/1.13.2/.gitkeep delete mode 100644 versions/1.14.4-forge/mapping.txt delete mode 100644 versions/1.14.4-forge/src/main/java/com/replaymod/core/ReplayModBackend.java delete mode 100644 versions/1.14.4-forge/src/main/java/com/replaymod/core/utils/ModInfoGetter.java delete mode 100644 versions/1.14.4/.gitkeep delete mode 100644 versions/1.14.4/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java delete mode 100644 versions/1.14.4/src/main/java/com/replaymod/render/mixin/ChunkRenderDispatcherAccessor.java delete mode 100644 versions/1.14.4/src/main/java/com/replaymod/render/mixin/MixinChunkRenderWorker.java delete mode 100644 versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java delete mode 100644 versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java delete mode 100644 versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java delete mode 100644 versions/1.14.4/src/main/java/com/replaymod/replay/mixin/MixinCamera.java delete mode 100644 versions/1.15.2/.gitkeep delete mode 100644 versions/1.16.1/.gitkeep delete mode 100644 versions/1.16.4-forge/.gitkeep delete mode 100644 versions/1.16.4-forge/src/main/java/com/replaymod/core/ReplayModBackend.java delete mode 100644 versions/1.16.4-forge/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java delete mode 100644 versions/1.16.4-forge/src/main/java/com/replaymod/core/utils/ModInfoGetter.java delete mode 100644 versions/1.16.4-forge/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java delete mode 100644 versions/1.16.4-forge/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java delete mode 100644 versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java delete mode 100644 versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java delete mode 100644 versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java delete mode 100644 versions/1.16.4-forge/src/main/java/com/replaymod/mixin/NetworkRegistryAccessor.java delete mode 100644 versions/1.16.4/.gitkeep delete mode 100644 versions/1.7.10/.gitkeep delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/core/asm/GLErrorTransformer.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/core/asm/GLStateTrackerTransformer.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/core/mixin/ResourcePackRepositoryAccessor.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/core/utils/ModInfoGetter.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/core/versions/BufferBuilder.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/recording/mixin/MixinS26PacketMapChunkBulk.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/render/hooks/GLStateTracker.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/replay/mixin/MixinEntityRenderer.java delete mode 100644 versions/1.7.10/src/main/java/com/replaymod/replay/mixin/MixinFMLClientHandler.java delete mode 100644 versions/1.8.9/.gitkeep delete mode 100644 versions/1.8.9/mapping.txt delete mode 100644 versions/1.8.9/src/main/java/com/replaymod/recording/mixin/MixinPlayerControllerMP.java delete mode 100644 versions/1.8.9/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java delete mode 100644 versions/1.8.9/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags_LivingEntity.java delete mode 100644 versions/1.8/.gitkeep delete mode 100644 versions/1.8/mapping.txt delete mode 100644 versions/1.9.4/.gitkeep delete mode 100644 versions/1.9.4/mapping.txt delete mode 100644 versions/core/.gitkeep delete mode 100644 versions/mainProject delete mode 100644 versions/mapping-1.16.4-fabric-forge.txt delete mode 100644 versions/mapping-fabric-1.15.2-1.14.4.txt diff --git a/versions/1.10.2/.gitkeep b/versions/1.10.2/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.11.2/.gitkeep b/versions/1.11.2/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.11.2/mapping.txt b/versions/1.11.2/mapping.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.11.2/src/main/java/com/replaymod/core/utils/ModInfoGetter.java b/versions/1.11.2/src/main/java/com/replaymod/core/utils/ModInfoGetter.java deleted file mode 100644 index 0d9db53a..00000000 --- a/versions/1.11.2/src/main/java/com/replaymod/core/utils/ModInfoGetter.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.replaymod.core.utils; - -import com.replaymod.replaystudio.data.ModInfo; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; -import net.minecraftforge.fml.common.registry.GameData; - -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -class ModInfoGetter { - static Collection getInstalledNetworkMods() { - Map ignoreCaseMap = Loader.instance().getModList().stream() - .collect(Collectors.toMap(m -> m.getModId().toLowerCase(), Function.identity())); - return Stream.concat( - ((Set) GameData.getBlockRegistry().getKeys()).stream(), - ((Set) GameData.getItemRegistry().getKeys()).stream() - ).map(ResourceLocation::getResourceDomain).filter(s -> !s.equals("minecraft")).distinct() - .map(String::toLowerCase).map(ignoreCaseMap::get).filter(Objects::nonNull) - .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) - .collect(Collectors.toList()); - } -} diff --git a/versions/1.11/.gitkeep b/versions/1.11/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.11/mapping.txt b/versions/1.11/mapping.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.12.1/.gitkeep b/versions/1.12.1/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.12.2/.gitkeep b/versions/1.12.2/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.12.2/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java b/versions/1.12.2/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java deleted file mode 100644 index 127450d5..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/compat/bettersprinting/DisableBetterSprinting.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.replaymod.compat.bettersprinting; - -import com.replaymod.replay.ReplayModReplay; -import com.replaymod.replay.events.ReplayChatMessageEvent; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.PlayerControllerMP; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.client.event.GuiOpenEvent; -import net.minecraftforge.common.MinecraftForge; - -//#if MC>=10904 -import net.minecraft.block.state.IBlockState; -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 javax.annotation.Nullable; -//#else -//#if MC>= 10800 -//$$ import net.minecraft.util.BlockPos; -//#endif -//$$ import net.minecraft.world.IWorldAccess; -//#endif - -//#if MC>=10800 -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion; -import net.minecraftforge.fml.common.versioning.Restriction; -import net.minecraftforge.fml.common.versioning.VersionRange; -//#else -//$$ import cpw.mods.fml.common.Loader; -//$$ import cpw.mods.fml.common.ModContainer; -//$$ import cpw.mods.fml.common.eventhandler.EventPriority; -//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; -//$$ import cpw.mods.fml.common.versioning.DefaultArtifactVersion; -//$$ import cpw.mods.fml.common.versioning.Restriction; -//$$ import cpw.mods.fml.common.versioning.VersionRange; -//#endif - -import java.util.Collections; - -import static com.replaymod.compat.ReplayModCompat.LOGGER; -import static com.replaymod.core.versions.MCVer.*; - -/** - * Old Better Sprinting versions replace the vanilla player with their own, overridden instance (replacing the camera entity). - * - * See: https://github.com/chylex/Better-Sprinting/blob/1.8/src/main/java/chylex/bettersprinting/client/player/impl/LogicImplOverride.java - */ -public class DisableBetterSprinting { - private static final VersionRange OLD_VERSION = VersionRange.newRange(null, - Collections.singletonList(new Restriction(null, false, new DefaultArtifactVersion("2.0.0"), false))); - private static final String LOGIC_CLASS_NAME = "chylex.bettersprinting.client.player.impl.LogicImplOverride"; - private static final String CONTROLLER_OVERRIDE_CLASS_NAME = LOGIC_CLASS_NAME + "$PlayerControllerMPOverride"; - - public static void register() { - Loader.instance().getModList().stream() - .filter(mod -> mod.getModId().equalsIgnoreCase("bettersprinting")) - .findFirst() - .map(ModContainer::getProcessedVersion).filter(OLD_VERSION::containsVersion) - .ifPresent($_ -> MinecraftForge.EVENT_BUS.register(new DisableBetterSprinting())); - } - - private DisableBetterSprinting() { - LOGGER.info("BetterSprinting workaround enabled"); - } - - private final Minecraft mc = Minecraft.getMinecraft(); - private PlayerControllerMP originalController; - private BetterSprintingWorldAccess worldAccessHook = new BetterSprintingWorldAccess(); - - @SubscribeEvent(priority = EventPriority.HIGH) - public void beforeGuiOpenEvent(GuiOpenEvent event) { - if (ReplayModReplay.instance.getReplayHandler() != null && mc.world != null) { - // During replay, get ready to revert BetterSprinting's overwritten playerController - originalController = mc.playerController; - //#if MC>=10904 - mc.world.addEventListener(worldAccessHook); - //#else - //$$ mc.theWorld.addWorldAccess(worldAccessHook); - //#endif - } - } - - @SubscribeEvent(priority = EventPriority.LOW) - public void afterGuiOpenEvent(GuiOpenEvent event) { - if (ReplayModReplay.instance.getReplayHandler() != null && mc.world != null) { - //#if MC>=10904 - mc.world.addEventListener(worldAccessHook); - //#else - //$$ mc.theWorld.addWorldAccess(worldAccessHook); - //#endif - } - } - - @SubscribeEvent - public void onReplayChatMessage(ReplayChatMessageEvent event) { - // Suppress this message if it's the Better Sprinting warning message - for (StackTraceElement elem : Thread.currentThread().getStackTrace()) { - if (LOGIC_CLASS_NAME.equals(elem.getClassName())) { - LOGGER.info("BetterSprinting warning message suppressed."); - event.setCanceled(true); - return; - } - } - } - - private class BetterSprintingWorldAccess - //#if MC>=10904 - implements IWorldEventListener - //#else - //$$ implements IWorldAccess - //#endif - { - @Override - //#if MC>=10800 - public void onEntityRemoved(Entity entityIn) { - //#else - //$$ public void onEntityDestroy(Entity entityIn) { - //#endif - if (mc.playerController != null && mc.playerController.getClass().getName().equals(CONTROLLER_OVERRIDE_CLASS_NAME)) { - // Someone has secretly swapped out the player controller and is about to substitute their own player entity. - // This is the right time to destroy their plan. - LOGGER.info("Preventing player controller {} from being replaced by BetterSprinting with {}.", originalController, mc.playerController); - mc.playerController = originalController; - } - } - - @Override public void markBlockRangeForRenderUpdate(int x1, int y1, int z1, int x2, int y2, int z2) {} - //#if MC>=10800 - @Override public void notifyLightSet(BlockPos pos) {} - @Override public void spawnParticle(int p_180442_1_, boolean p_180442_2_, double p_180442_3_, double p_180442_5_, double p_180442_7_, double p_180442_9_, double p_180442_11_, double p_180442_13_, int... p_180442_15_) {} - @Override public void onEntityAdded(Entity entityIn) {} - @Override public void broadcastSound(int p_180440_1_, BlockPos p_180440_2_, int p_180440_3_) {} - @Override public void sendBlockBreakProgress(int breakerId, BlockPos pos, int progress) {} - //#else - //$$ @Override public void markBlockForRenderUpdate(int x, int y, int z) {} - //$$ @Override public void spawnParticle(String p_72708_1_, double p_72708_2_, double p_72708_4_, double p_72708_6_, double p_72708_8_, double p_72708_10_, double p_72708_12_) {} - //$$ @Override public void onEntityCreate(Entity entityIn) {} - //$$ @Override public void broadcastSound(int p_180440_1_, int x, int y, int z, int p_180440_3_) {} - //$$ @Override public void destroyBlockPartially(int breakerId, int x, int y, int z, int progress) {} - //$$ @Override public void onStaticEntitiesChanged() {} - //#endif - //#if MC>=10904 - @Override public void notifyBlockUpdate(World worldIn, BlockPos pos, IBlockState oldState, IBlockState newState, int flags) {} - @Override public void playSoundToAllNearExcept(@Nullable EntityPlayer player, SoundEvent soundIn, SoundCategory category, double x, double y, double z, float volume, float pitch) {} - @Override public void playRecord(SoundEvent soundIn, BlockPos pos) {} - @Override public void playEvent(EntityPlayer player, int type, BlockPos blockPosIn, int data) {} - //#if MC>=11100 - //#if MC>=11102 - @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_) {} - //#else - //$$ @Override public void func_190570_a(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_) {} - //#endif - //#endif - //#else - //#if MC>=10800 - //$$ @Override public void markBlockForUpdate(BlockPos pos) {} - //$$ @Override public void playRecord(String recordName, BlockPos blockPosIn) {} - //#else - //$$ @Override public void markBlockForUpdate(int x, int y, int z) {} - //$$ @Override public void playRecord(String recordName, int x, int y, int z) {} - //#endif - //$$ @Override public void playSound(String soundName, double x, double y, double z, float volume, float pitch) {} - //$$ @Override public void playSoundToNearExcept(EntityPlayer except, String soundName, double x, double y, double z, float volume, float pitch) {} - //#if MC>=10809 - //$$ @Override public void playAuxSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} - //#else - //#if MC>=10800 - //$$ @Override public void playAusSFX(EntityPlayer p_180439_1_, int p_180439_2_, BlockPos blockPosIn, int p_180439_4_) {} - //#else - //$$ @Override public void playAuxSFX(EntityPlayer p_72706_1_, int p_72706_2_, int p_72706_3_, int p_72706_4_, int p_72706_5_, int p_72706_6_) {} - //#endif - //#endif - //#endif - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java b/versions/1.12.2/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java deleted file mode 100644 index 7a4a792c..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/compat/mapwriter/mixin/MixinMinecraft.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.replaymod.compat.mapwriter.mixin; - -import com.replaymod.replay.ReplayModReplay; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ServerData; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -//#if MC>=10800 -import net.minecraftforge.fml.common.Loader; -//#else -//$$ import cpw.mods.fml.common.Loader; -//#endif - -/** - * Approximately this for <1.12: https://github.com/Vectron/mapwriter/commit/68234520c7a3a0ae8201a085d7e66369900586ac - */ -@Mixin(Minecraft.class) -public abstract class MixinMinecraft { - - @Shadow - private ServerData currentServerData; - - @Inject(method = "getCurrentServerData", cancellable = true, at = @At("HEAD")) - private void replayModCompat_fixBug96(CallbackInfoReturnable ci) { - if (currentServerData == null - && (Loader.isModLoaded("mapwriter") || Loader.isModLoaded("MapWriter")) - && ReplayModReplay.instance.getReplayHandler() != null) { - for (StackTraceElement elem : Thread.currentThread().getStackTrace()) { - if ("mapwriter.util.Utils".equals(elem.getClassName()) && "getWorldName".equals(elem.getMethodName())) { - //#if MC>=10809 - ci.setReturnValue(new ServerData(null, "replay", false)); - //#else - //$$ ci.setReturnValue(new ServerData(null, "replay")); - //#endif - return; - } - } - } - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java b/versions/1.12.2/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java deleted file mode 100644 index 01aec589..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/compat/oranges17animations/HideInvisibleEntities.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.replaymod.compat.oranges17animations; - -import com.replaymod.core.ReplayMod; -import com.replaymod.replay.camera.CameraEntity; -import de.johni0702.minecraft.gui.utils.EventRegistrations; -import net.minecraft.client.Minecraft; -import net.minecraftforge.client.event.RenderLivingEvent; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -/** - * Orange seems to have copied vast parts of the RendererLivingEntity into their ArmorAnimation class which cancels the RenderLivingEvent.Pre and calls its own code instead. - * This breaks our mixin which assures that, even though the camera is in spectator mode, it cannot see invisible entities. - * - * To fix this issue, we simply cancel the RenderLivingEvent.Pre before it gets to ArmorAnimation if the entity is invisible. - */ -public class HideInvisibleEntities extends EventRegistrations { - private final Minecraft mc = Minecraft.getMinecraft(); - private final boolean modLoaded = ReplayMod.instance.isModLoaded("animations"); - - @SubscribeEvent(priority = EventPriority.HIGH) - public void preRenderLiving(RenderLivingEvent.Pre event) { - if (modLoaded) { - if (mc.player instanceof CameraEntity && event.getEntity().isInvisible()) { - event.setCanceled(true); - } - } - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/LoadingPlugin.java b/versions/1.12.2/src/main/java/com/replaymod/core/LoadingPlugin.java deleted file mode 100644 index cf6d0389..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/LoadingPlugin.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.replaymod.core; - -import net.minecraft.launchwrapper.Launch; -import org.apache.logging.log4j.LogManager; -import org.spongepowered.asm.launch.MixinBootstrap; -import org.spongepowered.asm.mixin.Mixins; - -import net.minecraftforge.fml.relauncher.CoreModManager; -import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; -//#if MC<10800 -//$$ import com.replaymod.core.asm.GLErrorTransformer; -//$$ import com.replaymod.core.asm.GLStateTrackerTransformer; -//$$ -//$$ import java.util.ArrayList; -//$$ import java.util.List; -//#endif - -import java.io.File; -import java.net.URISyntaxException; -import java.net.URL; -import java.security.CodeSource; -import java.util.Map; - -@IFMLLoadingPlugin.TransformerExclusions("com.replaymod.core.asm.") -public class LoadingPlugin implements IFMLLoadingPlugin { - - public LoadingPlugin() { - if (Launch.blackboard.get("fml.deobfuscatedEnvironment") != Boolean.FALSE) { - // Outside of the dev env, this is the job of the tweaker - MixinBootstrap.init(); - } - - Mixins.addConfiguration("mixins.core.replaymod.json"); - Mixins.addConfiguration("mixins.recording.replaymod.json"); - Mixins.addConfiguration("mixins.render.replaymod.json"); - Mixins.addConfiguration("mixins.render.blend.replaymod.json"); - Mixins.addConfiguration("mixins.replay.replaymod.json"); - Mixins.addConfiguration("mixins.compat.mapwriter.replaymod.json"); - Mixins.addConfiguration("mixins.compat.shaders.replaymod.json"); - Mixins.addConfiguration("mixins.extras.playeroverview.replaymod.json"); - - CodeSource codeSource = getClass().getProtectionDomain().getCodeSource(); - if (codeSource != null) { - URL location = codeSource.getLocation(); - try { - File file = new File(location.toURI()); - if (file.isFile()) { - // This forces forge to reexamine the jar file for FML mods - // Should eventually be handled by Mixin itself, maybe? - //#if MC>=10809 - CoreModManager.getIgnoredMods().remove(file.getName()); - //#else - //$$ CoreModManager.getLoadedCoremods().remove(file.getName()); - //#if MC<=10710 - //$$ CoreModManager.getReparseableCoremods().add(file.getName()); - //#endif - //#endif - } - } catch (URISyntaxException e) { - e.printStackTrace(); - } - } else { - LogManager.getLogger().warn("No CodeSource, if this is not a development environment we might run into problems!"); - LogManager.getLogger().warn(getClass().getProtectionDomain()); - } - } - - @Override - public String[] getASMTransformerClass() { - //#if MC>=10800 - return new String[]{ - }; - //#else - //$$ List transformers = new ArrayList<>(); - //$$ if ("true".equals(System.getProperty("replaymod.glerrors", "false"))) { - //$$ transformers.add(GLErrorTransformer.class.getName()); - //$$ } - //$$ transformers.add(GLStateTrackerTransformer.class.getName()); - //$$ return transformers.stream().toArray(String[]::new); - //#endif - } - - @Override - public String getModContainerClass() { - return null; - } - - @Override - public String getSetupClass() { - return null; - } - - @Override - public void injectData(Map data) { - } - - @Override - public String getAccessTransformerClass() { - return null; - } - -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/ReplayModBackend.java b/versions/1.12.2/src/main/java/com/replaymod/core/ReplayModBackend.java deleted file mode 100644 index 6da12741..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/ReplayModBackend.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.replaymod.core; - -import com.replaymod.core.mixin.MinecraftAccessor; -import com.replaymod.core.versions.forge.EventsAdapter; -import net.minecraft.client.resources.IResourcePack; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventHandler; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; - -import java.util.List; - -import static com.replaymod.core.ReplayMod.MOD_ID; -import static com.replaymod.core.ReplayMod.jGuiResourcePack; -import static com.replaymod.core.versions.MCVer.getMinecraft; - -//#if MC<=10710 -//$$ import net.minecraft.client.resources.FolderResourcePack; -//$$ import java.io.ByteArrayInputStream; -//$$ import java.io.File; -//$$ import java.io.IOException; -//$$ import java.io.InputStream; -//$$ import java.nio.charset.StandardCharsets; -//#endif - -@Mod(modid = ReplayMod.MOD_ID, - useMetadata = true, - version = "@MOD_VERSION@", - acceptedMinecraftVersions = "@MC_VERSION@", - acceptableRemoteVersions = "*", - //#if MC>=10800 - clientSideOnly = true, - updateJSON = "https://raw.githubusercontent.com/ReplayMod/ReplayMod/master/versions.json", - //#endif - guiFactory = "com.replaymod.core.gui.GuiFactory") -public class ReplayModBackend { - private final ReplayMod mod = new ReplayMod(this); - private final EventsAdapter eventsAdapter = new EventsAdapter(); - - @Deprecated - public static Configuration config; - - @EventHandler - public void init(FMLPreInitializationEvent event) { - config = new Configuration(event.getSuggestedConfigurationFile()); - config.load(); - SettingsRegistry settingsRegistry = mod.getSettingsRegistry(); - settingsRegistry.backend.setConfiguration(config); - settingsRegistry.save(); // Save default values to disk - } - - @EventHandler - public void init(FMLInitializationEvent event) { - mod.initModules(); - eventsAdapter.register(); - } - - public String getVersion() { - return Loader.instance().getIndexedModList().get(MOD_ID).getVersion(); - } - - public String getMinecraftVersion() { - return Loader.MC_VERSION; - } - - public boolean isModLoaded(String id) { - return Loader.isModLoaded(id); - } - - static { // Note: even preInit is too late and we'd have to issue another resource reload - List defaultResourcePacks = ((MinecraftAccessor) getMinecraft()).getDefaultResourcePacks(); - - if (jGuiResourcePack != null) { - defaultResourcePacks.add(jGuiResourcePack); - } - - //#if MC<=10710 - //$$ FolderResourcePack mainResourcePack = new FolderResourcePack(new File("../src/main/resources")) { - //$$ @Override - //$$ protected InputStream getInputStreamByName(String resourceName) throws IOException { - //$$ try { - //$$ return super.getInputStreamByName(resourceName); - //$$ } catch (IOException e) { - //$$ if ("pack.mcmeta".equals(resourceName)) { - //$$ return new ByteArrayInputStream(("{\"pack\": {\"description\": \"dummy pack for mod resources in dev-env\", \"pack_format\": 1}}").getBytes(StandardCharsets.UTF_8)); - //$$ } - //$$ throw e; - //$$ } - //$$ } - //$$ }; - //$$ defaultResourcePacks.add(mainResourcePack); - //#endif - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/SettingsRegistryBackend.java b/versions/1.12.2/src/main/java/com/replaymod/core/SettingsRegistryBackend.java deleted file mode 100644 index 41fa3211..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/SettingsRegistryBackend.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.replaymod.core; - -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.config.Property; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -class SettingsRegistryBackend { - private final Map, Object> settings; - - private static final Object NULL_OBJECT = new Object(); - private Configuration configuration; - - SettingsRegistryBackend(Map, Object> settings) { - this.settings = settings; - } - - public void register() { - } - - public void setConfiguration(Configuration configuration) { - this.configuration = configuration; - - for (SettingsRegistry.SettingKey key : new ArrayList<>(settings.keySet())) { - register(key); - } - } - - public void register(SettingsRegistry.SettingKey key) { - Object value; - if (configuration != null) { - if (key.getDefault() instanceof Boolean) { - value = configuration.get(key.getCategory(), key.getKey(), (Boolean) key.getDefault()).getBoolean(); - } else if (key.getDefault() instanceof Integer) { - value = configuration.get(key.getCategory(), key.getKey(), (Integer) key.getDefault()).getInt(); - } else if (key.getDefault() instanceof Double) { - value = configuration.get(key.getCategory(), key.getKey(), (Double) key.getDefault()).getDouble(); - } else if (key.getDefault() instanceof String) { - Property property = configuration.get(key.getCategory(), key.getKey(), (String) key.getDefault()); - value = property.getString(); - if (key instanceof SettingsRegistry.MultipleChoiceSettingKey) { - @SuppressWarnings("unchecked") - List choices = ((SettingsRegistry.MultipleChoiceSettingKey) key).getChoices(); - property.setValidValues(choices.toArray(new String[0])); - property.setComment("Valid values: " + String.join(", ", choices)); - } - } else { - throw new IllegalArgumentException("Default type " + key.getDefault().getClass() + " not supported."); - } - } else { - value = NULL_OBJECT; - } - settings.put(key, value); - } - - public void update(SettingsRegistry.SettingKey key, T value) { - if (key.getDefault() instanceof Boolean) { - configuration.get(key.getCategory(), key.getKey(), (Boolean) key.getDefault()).set((Boolean) value); - } else if (key.getDefault() instanceof Integer) { - configuration.get(key.getCategory(), key.getKey(), (Integer) key.getDefault()).set((Integer) value); - } else if (key.getDefault() instanceof Double) { - configuration.get(key.getCategory(), key.getKey(), (Double) key.getDefault()).set((Double) value); - } else if (key.getDefault() instanceof String) { - configuration.get(key.getCategory(), key.getKey(), (String) key.getDefault()).set((String) value); - } else { - throw new IllegalArgumentException("Default type " + key.getDefault().getClass() + " not supported."); - } - } - - public void save() { - configuration.save(); - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/gui/GuiFactory.java b/versions/1.12.2/src/main/java/com/replaymod/core/gui/GuiFactory.java deleted file mode 100644 index e2ac1ed4..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/gui/GuiFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.replaymod.core.gui; - -import com.replaymod.core.ReplayMod; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; - -//#if MC>=10800 -import net.minecraftforge.fml.client.IModGuiFactory; -//#else -//$$ import cpw.mods.fml.client.IModGuiFactory; -//#endif - -import java.util.Set; - -@SuppressWarnings("unused") -public class GuiFactory implements IModGuiFactory { - @Override - public void initialize(Minecraft minecraftInstance) { - - } - - //#if MC>=11200 - @Override - public boolean hasConfigGui() { - return true; - } - - @Override - public GuiScreen createConfigGui(GuiScreen parentScreen) { - return new GuiReplaySettings(parentScreen, ReplayMod.instance.getSettingsRegistry()).toMinecraft(); - } - //#else - //$$ @Override - //$$ public Class mainConfigGuiClass() { - //$$ return ConfigGuiWrapper.class; - //$$ } - //$$ - //$$ @Override - //$$ public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) { - //$$ return null; - //$$ } - //$$ - //$$ public static class ConfigGuiWrapper extends GuiScreen { - //$$ private final GuiScreen parent; - //$$ - //$$ public ConfigGuiWrapper(GuiScreen parent) { - //$$ this.parent = parent; - //$$ } - //$$ - //$$ @Override - //$$ public void initGui() { - //$$ new GuiReplaySettings(parent, ReplayMod.instance.getSettingsRegistry()).display(); - //$$ } - //$$ } - //#endif - - @Override - public Set runtimeGuiCategories() { - return null; - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/mixin/MixinKeyboardListener.java b/versions/1.12.2/src/main/java/com/replaymod/core/mixin/MixinKeyboardListener.java deleted file mode 100644 index 2e29e2ed..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/mixin/MixinKeyboardListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.replaymod.core.mixin; - -import com.replaymod.core.events.KeyBindingEventCallback; -import com.replaymod.core.events.KeyEventCallback; -import net.minecraft.client.settings.KeyBinding; -import org.lwjgl.input.Keyboard; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(KeyBinding.class) -public class MixinKeyboardListener { - @Inject(method = "onTick", at = @At("HEAD"), cancellable = true) - private static void beforeKeyBindingTick(CallbackInfo ci) { - int keyCode = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey(); - int action = Keyboard.getEventKeyState() ? KeyEventCallback.ACTION_PRESS : KeyEventCallback.ACTION_RELEASE; - if (KeyEventCallback.EVENT.invoker().onKeyEvent(keyCode, 0, action, 0)) { - ci.cancel(); - } - } - - @Inject(method = "onTick", at = @At("RETURN")) - private static void afterKeyBindingTick(CallbackInfo ci) { - KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java b/versions/1.12.2/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java deleted file mode 100644 index b6205d1c..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.replaymod.core.tweaker; - -import com.replaymod.extras.modcore.ModCoreInstaller; -import net.minecraft.launchwrapper.ITweaker; -import net.minecraft.launchwrapper.Launch; -import net.minecraft.launchwrapper.LaunchClassLoader; -import org.spongepowered.asm.launch.GlobalProperties; -import org.spongepowered.asm.launch.MixinBootstrap; -import org.spongepowered.asm.launch.platform.MixinPlatformManager; - -import java.io.File; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; - -//#if MC>=11200 -import org.spongepowered.asm.launch.platform.container.ContainerHandleURI; -//#endif - -// Fabric equivalent is in ReplayModMMLauncher -public class ReplayModTweaker implements ITweaker { - - private static final String MIXIN_TWEAKER = "org.spongepowered.asm.launch.MixinTweaker"; - - public ReplayModTweaker() { - injectMixinTweaker(); - } - - private void injectMixinTweaker() { - @SuppressWarnings("unchecked") - List tweakClasses = (List) Launch.blackboard.get("TweakClasses"); - - // If the MixinTweaker is already queued (because of another mod), then there's nothing we need to to - if (tweakClasses.contains(MIXIN_TWEAKER)) { - return; - } - - // If it is already booted, we're also good to go - if (GlobalProperties.get(GlobalProperties.Keys.INIT) != null) { - return; - } - - System.out.println("Injecting MixinTweaker from ReplayModTweaker"); - - // Otherwise, we need to take things into our own hands because the normal way to chainload a tweaker - // (by adding it to the TweakClasses list during injectIntoClassLoader) is too late for Mixin. - // Instead we instantiate the MixinTweaker on our own and add it to the current Tweaks list immediately. - Launch.classLoader.addClassLoaderExclusion(MIXIN_TWEAKER.substring(0, MIXIN_TWEAKER.lastIndexOf('.'))); - @SuppressWarnings("unchecked") - List tweaks = (List) Launch.blackboard.get("Tweaks"); - try { - tweaks.add((ITweaker) Class.forName(MIXIN_TWEAKER, true, Launch.classLoader).newInstance()); - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - @Override - public void acceptOptions(List args, File gameDir, File assetsDir, String profile) { - } - - @Override - public void injectIntoClassLoader(LaunchClassLoader classLoader) { - // Add our jar as a Mixin container (cause normally Mixin detects those via the TweakClass manifest entry) - URI uri; - try { - uri = this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI(); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - MixinPlatformManager platform = MixinBootstrap.getPlatform(); - //#if MC>=11200 - platform.addContainer(new ContainerHandleURI(uri)); - //#else - //$$ platform.addContainer(uri); - //#endif - - //#if MC>=11202 && MC<=11202 - initModCore("1.12.2"); - //#endif - //#if MC>=10809 && MC<=10809 - //$$ initModCore("1.8.9"); - //#endif - } - - @Override - public String getLaunchTarget() { - return null; - } - - @Override - public String[] getLaunchArguments() { - return new String[0]; - } - - private void initModCore(String mcVer) { - try { - if (System.getProperty("REPLAYMOD_SKIP_MODCORE", "false").equalsIgnoreCase("true")) { - System.out.println("ReplayMod not initializing ModCore because REPLAYMOD_SKIP_MODCORE is true."); - return; - } - - if ((Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment")) { - System.out.println("ReplayMod not initializing ModCore because we're in a development environment."); - return; - } - - int result = ModCoreInstaller.initialize(Launch.minecraftHome, mcVer + "_forge"); - if (result != -2) { // Don't even bother logging the result if there's no ModCore for this version. - System.out.println("ReplayMod ModCore init result: " + result); - } - if (ModCoreInstaller.isErrored()) { - System.err.println(ModCoreInstaller.getError()); - } - } catch (Throwable t) { - System.err.println("ReplayMod caught error during ModCore init:"); - t.printStackTrace(); - } - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/utils/ModInfoGetter.java b/versions/1.12.2/src/main/java/com/replaymod/core/utils/ModInfoGetter.java deleted file mode 100644 index 1ec326e3..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/utils/ModInfoGetter.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.replaymod.core.utils; - -import com.replaymod.replaystudio.data.ModInfo; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; -import net.minecraftforge.registries.ForgeRegistry; -import net.minecraftforge.registries.RegistryManager; - -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -class ModInfoGetter { - static Collection getInstalledNetworkMods() { - Map ignoreCaseMap = Loader.instance().getModList().stream() - .collect(Collectors.toMap(m -> m.getModId().toLowerCase(), Function.identity())); - return RegistryManager.ACTIVE.takeSnapshot(false).keySet().stream() - .map(RegistryManager.ACTIVE::getRegistry) - .map(ForgeRegistry::getKeys).flatMap(Set::stream) - .map(ResourceLocation::getResourceDomain).filter(s -> !s.equals("minecraft")).distinct() - .map(String::toLowerCase).map(ignoreCaseMap::get).filter(Objects::nonNull) - .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) - .collect(Collectors.toList()); - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/versions/GLFW.java b/versions/1.12.2/src/main/java/com/replaymod/core/versions/GLFW.java deleted file mode 100644 index 0c30d254..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/versions/GLFW.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.replaymod.core.versions; - -import org.lwjgl.opengl.Display; - -public class GLFW { - public static boolean glfwWindowShouldClose(@SuppressWarnings("unused") long handle) { - return Display.isCloseRequested(); - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/versions/Window.java b/versions/1.12.2/src/main/java/com/replaymod/core/versions/Window.java deleted file mode 100644 index d0a3ddba..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/versions/Window.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.replaymod.core.versions; - -import com.replaymod.render.mixin.MainWindowAccessor; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import org.lwjgl.opengl.Display; - -public class Window implements MainWindowAccessor { - - private final Minecraft mc; - private ScaledResolution scaledResolution; - - public Window(Minecraft mc) { - this.mc = mc; - } - - @Override - public int getFramebufferWidth() { - return mc.displayWidth; - } - - @Override - public void setFramebufferWidth(int value) { - mc.displayWidth = value; - } - - @Override - public int getFramebufferHeight() { - return mc.displayHeight; - } - - @Override - public void setFramebufferHeight(int value) { - mc.displayHeight = value; - } - - public long getHandle() { - return 0; - } - - public int getWidth() { - return Display.getWidth(); - } - - public int getHeight() { - return Display.getHeight(); - } - - private ScaledResolution scaledResolution() { - ScaledResolution scaledResolution = this.scaledResolution; - if (scaledResolution == null) { - //#if MC>=10809 - scaledResolution = new ScaledResolution(mc); - //#else - //$$ scaledResolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); - //#endif - this.scaledResolution = scaledResolution; - } - return scaledResolution; - } - - public int getScaledWidth() { - return scaledResolution().getScaledWidth(); - } - - public int getScaledHeight() { - return scaledResolution().getScaledWidth(); - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java b/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java deleted file mode 100644 index 4a567d0c..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.replaymod.core.versions.forge; - -import com.replaymod.core.events.KeyBindingEventCallback; -import com.replaymod.core.events.PostRenderCallback; -import com.replaymod.core.events.PostRenderWorldCallback; -import com.replaymod.core.events.PreRenderCallback; -import com.replaymod.core.events.PreRenderHandCallback; -import com.replaymod.core.versions.MCVer; -import com.replaymod.replay.events.RenderHotbarCallback; -import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; -import de.johni0702.minecraft.gui.utils.EventRegistrations; -import de.johni0702.minecraft.gui.versions.MatrixStack; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.RenderHandEvent; -import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.InputEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; - -public class EventsAdapter extends EventRegistrations { - @SubscribeEvent - public void onKeyEvent(InputEvent.KeyInputEvent event) { - KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); - } - - @SubscribeEvent - public void onMouseInput(InputEvent.MouseInputEvent event) { - KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); - } - - @SubscribeEvent - public void preRender(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.START) return; - PreRenderCallback.EVENT.invoker().preRender(); - } - - @SubscribeEvent - public void postRender(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.END) return; - PostRenderCallback.EVENT.invoker().postRender(); - } - - @SubscribeEvent - public void renderCameraPath(RenderWorldLastEvent event) { - PostRenderWorldCallback.EVENT.invoker().postRenderWorld(new MatrixStack()); - } - - @SubscribeEvent - public void oRenderHand(RenderHandEvent event) { - if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) { - event.setCanceled(true); - } - } - - @SubscribeEvent - public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) { - Boolean result = null; - switch (event.getType()) { - case CROSSHAIRS: - result = RenderSpectatorCrosshairCallback.EVENT.invoker().shouldRenderSpectatorCrosshair(); - break; - case HOTBAR: - result = RenderHotbarCallback.EVENT.invoker().shouldRenderHotbar(); - break; - } - if (result == Boolean.FALSE) { - event.setCanceled(true); - } - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/Patterns.java b/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/Patterns.java deleted file mode 100644 index 0f8a6ff3..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/versions/forge/Patterns.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.replaymod.core.versions.forge; - -import com.replaymod.gradle.remap.Pattern; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.entity.EntityLivingBase; -import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.RenderLivingEvent; -import net.minecraftforge.common.config.Property; - -class Patterns { - @Pattern - private static GuiButton getButton(GuiScreenEvent.ActionPerformedEvent event) { - //#if MC>=10904 - return event.getButton(); - //#else - //$$ return event.button; - //#endif - } - - @Pattern - private static GuiScreen getGui(GuiScreenEvent event) { - //#if MC>=10904 - return event.getGui(); - //#else - //$$ return event.gui; - //#endif - } - - @Pattern - private static EntityLivingBase getEntity(RenderLivingEvent event) { - //#if MC>=10904 - return event.getEntity(); - //#else - //$$ return event.entity; - //#endif - } - - @Pattern - private static RenderGameOverlayEvent.ElementType getType(RenderGameOverlayEvent event) { - //#if MC>=10904 - return event.getType(); - //#else - //$$ return event.type; - //#endif - } - - @Pattern - private static void setComment(Property property, String comment) { - //#if MC>=10900 - property.setComment(comment); - //#else - //$$ property.comment = comment; - //#endif - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java b/versions/1.12.2/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java deleted file mode 100644 index 65444afc..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.replaymod.core.versions.scheduler; - -import com.google.common.util.concurrent.ListenableFutureTask; -import com.replaymod.core.mixin.MinecraftAccessor; -import net.minecraft.client.Minecraft; -import net.minecraft.util.ReportedException; -import net.minecraftforge.fml.common.eventhandler.EventBus; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; - -import java.util.Queue; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.FutureTask; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -//#if MC>=10809 -import net.minecraftforge.common.MinecraftForge; -//#else -//$$ import net.minecraftforge.fml.common.FMLCommonHandler; -//#endif - -//#if MC<10800 -//$$ import java.util.ArrayDeque; -//#endif - -public class SchedulerImpl implements Scheduler { - private static final Minecraft mc = Minecraft.getMinecraft(); - - //#if MC>=10809 - private static final EventBus FML_BUS = MinecraftForge.EVENT_BUS; - //#else - //$$ private static final EventBus FML_BUS = FMLCommonHandler.instance().bus(); - //#endif - - @Override - public void runSync(Runnable runnable) throws InterruptedException, ExecutionException, TimeoutException { - if (mc.isCallingFromMinecraftThread()) { - runnable.run(); - } else { - FutureTask future = new FutureTask<>(runnable, null); - runLater(future); - future.get(30, TimeUnit.SECONDS); - } - } - - @Override - public void runPostStartup(Runnable runnable) { - runLater(runnable); - } - - /** - * Set when the currently running code has been scheduled by runLater. - * If this is the case, subsequent calls to runLater have to be delayed until all scheduled tasks have been - * processed, otherwise a livelock may occur. - */ - private boolean inRunLater = false; - - @Override - public void runLaterWithoutLock(Runnable runnable) { - runLater(() -> runLaterWithoutLock(runnable), runnable); - } - - public void runLater(Runnable runnable) { - runLater(runnable, () -> runLater(runnable)); - } - - private void runLater(Runnable runnable, Runnable defer) { - if (mc.isCallingFromMinecraftThread() && inRunLater) { - //#if MC>=10800 - FML_BUS.register(new Object() { - @SubscribeEvent - public void onRenderTick(TickEvent.RenderTickEvent event) { - if (event.phase == TickEvent.Phase.START) { - FML_BUS.unregister(this); - defer.run(); - } - } - }); - //#else - //$$ FML_BUS.register(new RunLaterHelper(defer)); - //#endif - return; - } - //#if MC>=10800 - Queue> tasks = ((MinecraftAccessor) mc).getScheduledTasks(); - //noinspection SynchronizationOnLocalVariableOrMethodParameter - synchronized (tasks) { - //#else - //$$ Queue> tasks = scheduledTasks; - //$$ synchronized (scheduledTasks) { - //#endif - tasks.add(ListenableFutureTask.create(() -> { - inRunLater = true; - try { - runnable.run(); - } catch (ReportedException e) { - e.printStackTrace(); - System.err.println(e.getCrashReport().getCompleteReport()); - mc.crashed(e.getCrashReport()); - } finally { - inRunLater = false; - } - }, null)); - } - } - - //#if MC>=10800 - @Override - public void runTasks() { - } - //#else - //$$ // 1.7.10: Cannot use MC's because it is processed only during ticks (so not at all when replay is paused) - //$$ private final Queue> scheduledTasks = new ArrayDeque<>(); - //$$ - //$$ // in 1.7.10 apparently events can't be delivered to anonymous classes - //$$ public class RunLaterHelper { - //$$ private final Runnable defer; - //$$ - //$$ private RunLaterHelper(Runnable defer) { - //$$ this.defer = defer; - //$$ } - //$$ - //$$ @SubscribeEvent - //$$ public void onRenderTick(TickEvent.RenderTickEvent event) { - //$$ if (event.phase == TickEvent.Phase.START) { - //$$ FML_BUS.unregister(this); - //$$ defer.run(); - //$$ } - //$$ } - //$$ } - //$$ - //$$ @Override - //$$ public void runTasks() { - //$$ synchronized (scheduledTasks) { - //$$ while (!scheduledTasks.isEmpty()) { - //$$ scheduledTasks.poll().run(); - //$$ } - //$$ } - //$$ } - //#endif -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java b/versions/1.12.2/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java deleted file mode 100644 index f53c5533..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/recording/handler/FMLHandshakeFilter.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.replaymod.recording.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage; - -/** - * Filters out all handshake packets that were sent for recording but must - * not actually be handled. - * This handler is only present when connected to the integrated server as - * otherwise all packets must be handled. - * - * When in single player, the game state packets must never be handled - * otherwise wired bugs related to semi-singletons can occur. - * See https://bugs.replaymod.com/show_bug.cgi?id=44 - */ -public class FMLHandshakeFilter extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, FMLHandshakeMessage msg) throws Exception { - //#if MC>=10800 - if (!(msg instanceof FMLHandshakeMessage.RegistryData)) { - //#else - //$$ if (!(msg instanceof FMLHandshakeMessage.ModIdData)) { - //#endif - // Pass on everything but RegistryData messages - ctx.fireChannelRead(msg); - } - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java b/versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java deleted file mode 100644 index 10c052e8..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerLoginClient.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.replaymod.recording.mixin; - -import com.replaymod.recording.ReplayModRecording; -import net.minecraft.client.network.NetHandlerLoginClient; -import net.minecraft.network.NetworkManager; -import net.minecraftforge.fml.common.network.FMLNetworkEvent; -import org.spongepowered.asm.mixin.Final; -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(NetHandlerLoginClient.class) -public abstract class MixinNetHandlerLoginClient { - - @Final @Shadow - private NetworkManager networkManager; - - /** - * Starts the recording right before switching into PLAY state. - * We cannot use the {@link FMLNetworkEvent.ClientConnectedToServerEvent} - * as it only fires after the forge handshake. - */ - @Inject(method = "handleLoginSuccess", at=@At("HEAD")) - public void replayModRecording_initiateRecording(CallbackInfo cb) { - ReplayModRecording.instance.initiateRecording(this.networkManager); - } - - // Race condition in Forge's networking (not sure if still present in 1.13) - //#if MC>=11200 && MC<11400 - @Inject(method = "handleLoginSuccess", at=@At("RETURN")) - public void replayModRecording_raceConditionWorkAround(CallbackInfo cb) { - ((NetworkManagerAccessor) this.networkManager).getChannel().config().setAutoRead(true); - } - //#endif -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java b/versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java deleted file mode 100644 index 120dd947..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinNetworkDispatcher.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.replaymod.recording.mixin; - -import com.replaymod.recording.handler.FMLHandshakeFilter; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.embedded.EmbeddedChannel; -import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec; -import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; -import net.minecraftforge.fml.relauncher.Side; -import org.spongepowered.asm.mixin.Final; -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; - -//#if MC>=11200 -import io.netty.channel.ChannelConfig; -import net.minecraft.network.EnumConnectionState; -import net.minecraft.network.NetworkManager; -import org.spongepowered.asm.mixin.injection.Redirect; -//#endif - -@Mixin(value = NetworkDispatcher.class, remap = false) -public abstract class MixinNetworkDispatcher { - - @Final @Shadow - private Side side; - - @Final @Shadow - private EmbeddedChannel handshakeChannel; - - /** - * Always sets fml:isLocal to false on the server side. - * This effectively removes the difference in the FML handshake between SP and MP - * and forces the block/item ids, etc. to always be send. - * Injects a {@link FMLHandshakeFilter} on the client side to filter out - * those extra, unexpected packets. - */ - @Inject(method = "insertIntoChannel", at=@At("HEAD")) - public void replayModRecording_setupForLocalRecording(CallbackInfo cb) { - // If we're in multiplayer, everything is fine as is - if (!handshakeChannel.attr(NetworkDispatcher.IS_LOCAL).get()) return; - - if (side == Side.SERVER) { - // On the server side, force all packets to be sent - handshakeChannel.attr(NetworkDispatcher.IS_LOCAL).set(false); - } else { - // On the client side, discard additional packets - ChannelPipeline pipeline = handshakeChannel.pipeline(); - pipeline.addAfter(pipeline.context(FMLHandshakeCodec.class).name(), - "replaymod_filter", new FMLHandshakeFilter()); - } - } - - //#if MC>=11200 - @Redirect(method = "clientListenForServerHandshake", at = @At(value = "INVOKE", remap = true, target = - "Lnet/minecraft/network/NetworkManager;setConnectionState(Lnet/minecraft/network/EnumConnectionState;)V")) - public void replayModRecording_raceConditionWorkAround1(NetworkManager self, EnumConnectionState ignored) { } - - @Redirect(method = "insertIntoChannel", at = @At(value = "INVOKE", target = - "Lio/netty/channel/ChannelConfig;setAutoRead(Z)Lio/netty/channel/ChannelConfig;")) - public ChannelConfig replayModRecording_raceConditionWorkAround2(ChannelConfig self, boolean autoRead) { - if (side == Side.CLIENT) { - autoRead = false; - } - return self.setAutoRead(autoRead); - } - //#endif -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinPlayerControllerMP.java b/versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinPlayerControllerMP.java deleted file mode 100644 index 11e08b99..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/recording/mixin/MixinPlayerControllerMP.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.replaymod.recording.mixin; - -//#if MC>=10904 && MC<11400 -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.Final; -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; - -import static com.replaymod.core.versions.MCVer.*; - -@Mixin(PlayerControllerMP.class) -public abstract class MixinPlayerControllerMP implements RecordingEventHandler.RecordingEventSender { - - @Final @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); - } -} -//#endif diff --git a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/MainWindowAccessor.java b/versions/1.12.2/src/main/java/com/replaymod/render/mixin/MainWindowAccessor.java deleted file mode 100644 index 2d91cb58..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/MainWindowAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.replaymod.render.mixin; - -import net.minecraft.client.Minecraft; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(Minecraft.class) -public interface MainWindowAccessor { - @Accessor("displayWidth") - int getFramebufferWidth(); - @Accessor("displayWidth") - void setFramebufferWidth(int value); - @Accessor("displayHeight") - int getFramebufferHeight(); - @Accessor("displayHeight") - void setFramebufferHeight(int value); -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_ChromaKeyDisableFog.java b/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_ChromaKeyDisableFog.java deleted file mode 100644 index e3c1e00c..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_ChromaKeyDisableFog.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.replaymod.render.mixin; - -import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.renderer.EntityRenderer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(EntityRenderer.class) -public abstract class Mixin_ChromaKeyDisableFog implements EntityRendererHandler.IEntityRenderer { - @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true) - private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) { - EntityRendererHandler handler = replayModRender_getHandler(); - if (handler != null && handler.getSettings().getChromaKeyingColor() != null) { - ci.cancel(); - } - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java b/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java deleted file mode 100644 index 9f7d56de..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.replaymod.render.mixin; - -import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.renderer.EntityRenderer; -import org.lwjgl.util.glu.Project; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(EntityRenderer.class) -public abstract class Mixin_Omnidirectional_Camera implements EntityRendererHandler.IEntityRenderer { - @Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) - private void replayModRender_gluPerspective$0(float fovY, float aspect, float zNear, float zFar) { - replayModRender_gluPerspective(fovY, aspect, zNear, zFar); - } - - //#if MC>=10800 - @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) - //#else - //$$ @Redirect(method = "renderHand", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) - //#endif - private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) { - replayModRender_gluPerspective(fovY, aspect, zNear, zFar); - } - - //#if MC>=10800 - @Redirect(method = "renderCloudsCheck", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) - private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) { - replayModRender_gluPerspective(fovY, aspect, zNear, zFar); - } - //#endif - - private void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) { - if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { - fovY = 90; - aspect = 1; - } - Project.gluPerspective(fovY, aspect, zNear, zFar); - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java b/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java deleted file mode 100644 index 5cf178a5..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_HandRenderPass.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.replaymod.render.mixin; - -import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; -import com.replaymod.render.hooks.EntityRendererHandler; -import com.replaymod.replay.camera.CameraEntity; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.EntityRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -@Mixin(EntityRenderer.class) -public abstract class Mixin_Stereoscopic_HandRenderPass implements EntityRendererHandler.IEntityRenderer { - @ModifyVariable(method = "renderHand", at = @At("HEAD"), argsOnly = true) - private int replayModRender_renderSpectatorHand(int renderPass) { - EntityRendererHandler handler = replayModRender_getHandler(); - if (handler != null) { - Entity currentEntity = Minecraft.getMinecraft().getRenderViewEntity(); - if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) { - if (renderPass == 2) { // Need to update render pass - renderPass = handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0; - } - } - } - return renderPass; - } -} diff --git a/versions/1.12.2/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java b/versions/1.12.2/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java deleted file mode 100644 index 38080714..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/replay/mixin/MixinRenderManager.java +++ /dev/null @@ -1,30 +0,0 @@ -// Appears to no longer be needed in 1.14+ (maybe not even 1.13?) -//#if MC>=10800 -package com.replaymod.replay.mixin; - -import net.minecraft.client.settings.GameSettings; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.entity.Entity; -import net.minecraft.entity.passive.EntityAnimal; -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; - -@Mixin(RenderManager.class) -public class MixinRenderManager { - @Shadow - public float playerViewY; - - @Inject(method = "cacheActiveRenderInfo", at = @At("RETURN")) - public void fixHeadRotationForAnimals(World world, FontRenderer font, Entity view, Entity target, GameSettings settings, float partialRenderTick, CallbackInfo ci) { - if (view instanceof EntityAnimal && !((EntityAnimal) view).isPlayerSleeping()) { - EntityAnimal e = (EntityAnimal) view; - this.playerViewY = e.prevRotationYawHead + (e.rotationYawHead - e.prevRotationYawHead) * partialRenderTick; - } - } -} -//#endif diff --git a/versions/1.12.2/src/main/java/com/replaymod/replay/mixin/MixinWorldClient.java b/versions/1.12.2/src/main/java/com/replaymod/replay/mixin/MixinWorldClient.java deleted file mode 100644 index 643ac038..00000000 --- a/versions/1.12.2/src/main/java/com/replaymod/replay/mixin/MixinWorldClient.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.replaymod.replay.mixin; - -import net.minecraft.client.multiplayer.WorldClient; -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.CallbackInfo; - -@Mixin(WorldClient.class) -public abstract class MixinWorldClient { - - /** - * Fixes a bug in vanilla Minecraft that leaves entities remaining in the entityList even after respawn. - * The entityList in WorldClient is a Set that assumes that the entity ID of its entities does not change. - * However in {@link WorldClient#addEntityToWorld(int, Entity)}, the entity passed in is first added to the - * set and subsequently its id is changed, leaving it stuck in he Set. That is the buggy method. - * This wouldn't be too much of a problem if the entity had the correct id to begin with, however the handler for - * the spawn player packet creates an EntityOtherPlayerMP which takes its id from a counter and then passes it to - * this method with the wrong id. - * This mixin fixes the id of the entity before it is added to the set instead of right after. - * The original id change right after is not changed, however it should not have any effect. - * @param entityId The id to be set for the entity - * @param entity The entity to be added - * @param ci Callback info - */ - @Inject(method = "addEntityToWorld", at=@At("HEAD")) - public void replayModReplay_fix_addEntityToWorld(int entityId, Entity entity, CallbackInfo ci) { - entity.setEntityId(entityId); - } -} diff --git a/versions/1.12/.gitkeep b/versions/1.12/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.12/mapping.txt b/versions/1.12/mapping.txt deleted file mode 100644 index 7f5599f4..00000000 --- a/versions/1.12/mapping.txt +++ /dev/null @@ -1 +0,0 @@ -net.minecraft.client.renderer.BufferBuilder net.minecraft.client.renderer.VertexBuffer diff --git a/versions/1.13.2/.gitkeep b/versions/1.13.2/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.14.4-forge/mapping.txt b/versions/1.14.4-forge/mapping.txt deleted file mode 100644 index ec310305..00000000 --- a/versions/1.14.4-forge/mapping.txt +++ /dev/null @@ -1,369 +0,0 @@ -net.minecraft.potion.EffectInstance net.minecraft.potion.PotionEffect -net.minecraft.client.gui.screen.AddServerScreen net.minecraft.client.gui.GuiScreenAddServer -net.minecraft.resources.AbstractResourcePack net.minecraft.client.resources.AbstractResourcePack -net.minecraft.resources.FolderPack net.minecraft.client.resources.FolderResourcePack -net.minecraft.client.resources.DownloadingPackFinder net.minecraft.client.resources.ResourcePackRepository -net.minecraft.client.renderer.chunk.ChunkRenderTask net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator -net.minecraft.client.settings.AbstractOption net.minecraft.client.settings.GameSettings.Options -net.minecraft.client.settings.AbstractOption func_216728_a() setValueMax() -net.minecraftforge.eventbus.api.SubscribeEvent net.minecraftforge.fml.common.eventhandler.SubscribeEvent -net.minecraftforge.eventbus.api.EventPriority net.minecraftforge.fml.common.eventhandler.EventPriority -net.minecraftforge.eventbus.api.Cancelable net.minecraftforge.fml.common.eventhandler.Cancelable -net.minecraftforge.eventbus.api.Event net.minecraftforge.fml.common.eventhandler.Event -net.minecraft.crash.ReportedException net.minecraft.util.ReportedException -net.minecraftforge.eventbus.api.IEventBus net.minecraftforge.fml.common.eventhandler.EventBus -net.minecraft.network.play.server.SPacketEntity.Move net.minecraft.network.play.server.SPacketEntity.S17PacketEntityLookMove -net.minecraftforge.fml.network.NetworkRegistry net.minecraftforge.fml.common.network.NetworkRegistry -net.minecraft.client.particle.ParticleManager queue queueEntityFX -org.apache.maven.artifact.versioning.ComparableVersion net.minecraftforge.fml.common.versioning.ComparableVersion -org.lwjgl.glfw.GLFW com.replaymod.core.versions.GLFW -net.minecraft.client.MainWindow com.replaymod.core.versions.Window -net.minecraft.client.audio.SimpleSound net.minecraft.client.audio.PositionedSoundRecord - -net.minecraft.resources.FolderPack getInputStream() getInputStreamByName() -net.minecraft.client.gui.GuiYesNoCallback confirmResult() confirmClicked() -net.minecraft.util.text.ITextComponent getString() getUnformattedText() -net.minecraft.network.play.server.SPacketRespawn func_212643_b() getDimensionID() -net.minecraft.client.Minecraft getPackFinder() getResourcePackRepository() - -net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent addWidget() addButton() -net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent removeWidget() removeButton() -net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent getWidgetList() getButtonList() -net.minecraftforge.event.TickEvent net.minecraftforge.fml.common.gameevent.TickEvent -net.minecraft.potion.Effects net.minecraft.init.MobEffects -net.minecraftforge.event.entity.player.PlayerEvent net.minecraftforge.fml.common.gameevent.PlayerEvent -net.minecraftforge.event.entity.player.PlayerEvent.ItemPickupEvent net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent - -# -# Note: These were in large part written before the preprocessor got smart, a good deal of them can probably be removed -# by now. Just gotta find someone to do it. Or automate it. Probably the latter, later. -# They're also in some parts outdated since they used to be 1.14.4-fabric to 1.13.2-forge but are now used for -# 1.14.4-forge to 1.12.2-forge (since the preprocessor handles the fabric-forge jump on 1.14.4). -# -net.minecraft.client.particle.Particle x posX -net.minecraft.client.particle.Particle y posY -net.minecraft.client.particle.Particle z posZ -net.minecraft.client.particle.Particle cameraX interpPosX -net.minecraft.client.particle.Particle cameraY interpPosY -net.minecraft.client.particle.Particle cameraZ interpPosZ -net.minecraft.entity.player.PlayerModelPart net.minecraft.entity.player.EnumPlayerModelParts -net.minecraft.util.Direction net.minecraft.util.EnumFacing -net.minecraft.client.render.model.BakedQuad net.minecraft.client.renderer.model.BakedQuad -net.minecraft.client.render.model.BakedQuad hasColor() hasTintIndex() -net.minecraft.client.render.model.BakedQuad getColorIndex() getTintIndex() -net.minecraft.client.renderer.tileentity.EndPortalTileEntityRenderer net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer -net.minecraft.client.render.model.BakedModel net.minecraft.client.renderer.model.IBakedModel -net.minecraft.client.util.math.Matrix4f net.minecraft.client.renderer.Matrix4f -net.minecraft.client.util.math.Matrix4f method_4929() perspective() -net.minecraft.client.render.Frustum net.minecraft.client.renderer.culling.Frustum -net.minecraft.client.render.Frustum intersects() isBoxInFrustum() -net.minecraft.client.texture.NativeImage net.minecraft.client.renderer.texture.NativeImage -net.minecraft.client.particle.ParticleManager newParticles queue -net.minecraft.client.particle.ParticleManager setWorld() clearEffects() -net.minecraft.client.util.Session net.minecraft.util.Session -net.minecraft.server.integrated.IntegratedServer field_5524 isGamePaused -net.minecraft.client.render.block.entity.EndPortalBlockEntityRenderer net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer -# Note: method actually part of super class but Remap doesn't support those for @Redirect -net.minecraft.client.render.block.entity.EndPortalBlockEntityRenderer method_3591() render() -net.minecraft.client.render.block.entity.BlockEntityRenderer net.minecraft.client.renderer.tileentity.TileEntityRenderer -net.minecraft.client.render.block.entity.BlockEntityRenderer method_3591() render() -net.minecraft.client.gui.SpectatorGui net.minecraft.client.gui.GuiSpectator -net.minecraft.client.gui.SpectatorGui method_1976() onHotbarSelected() -net.minecraft.entity.passive.AnimalEntity net.minecraft.entity.passive.EntityAnimal -net.minecraft.item.ItemStack getName() getDisplayName() -net.minecraft.client.gui.Element net.minecraft.client.gui.IGuiEventListener -net.minecraft.util.text.StringTextComponent net.minecraft.util.text.TextComponentString -net.minecraft.util.text.TranslationTextComponent net.minecraft.util.text.TextComponentTranslation -net.minecraft.client.renderer.entity.LivingRenderer net.minecraft.client.renderer.entity.RenderLivingBase -net.minecraft.client.renderer.entity.LivingRenderer method_4055() canRenderName() -net.minecraft.client.renderer.entity.LivingRenderer render() renderModel() -net.minecraft.client.renderer.entity.LivingRenderer scaleAndTranslate() prepareScale() -net.minecraft.client.renderer.entity.LivingRenderer method_4054() doRender() -net.minecraft.client.renderer.entity.TippedArrowRenderer net.minecraft.client.renderer.entity.RenderArrow -net.minecraft.client.renderer.entity.EntityRenderer net.minecraft.client.renderer.entity.Render -net.minecraft.client.renderer.entity.EntityRenderer render() doRender() -net.minecraft.client.renderer.entity.EntityRenderer renderLabel() renderLivingLabel() -net.minecraft.client.multiplayer.PlayerController net.minecraft.client.multiplayer.PlayerControllerMP -net.minecraft.client.multiplayer.PlayerController client mc -net.minecraft.client.multiplayer.PlayerController networkHandler connection -net.minecraft.client.multiplayer.PlayerController isFlyingLocked() isSpectatorMode() -net.minecraft.client.multiplayer.PlayerController getCurrentGameMode() getCurrentGameType() -com.mojang.blaze3d.platform.GLX net.minecraft.client.renderer.OpenGlHelper -com.mojang.blaze3d.platform.GLX isUsingFBOs() isFramebufferEnabled() -net.minecraft.client.renderer.chunk.ChunkRender net.minecraft.client.renderer.chunk.RenderChunk -net.minecraft.client.renderer.chunk.ChunkRender unscheduleRebuild() clearNeedsUpdate() -net.minecraft.nbt.CompoundNBT net.minecraft.nbt.NBTTagCompound -net.minecraft.client.render.BackgroundRenderer net.minecraft.client.renderer.FogRenderer -net.minecraft.client.render.BackgroundRenderer applyFog() setupFog() -net.minecraft.resource.Resource net.minecraft.resources.IResource -net.minecraft.client.renderer.ItemRenderer net.minecraft.client.renderer.RenderItem -net.minecraft.client.renderer.FirstPersonRenderer net.minecraft.client.renderer.ItemRenderer -net.minecraft.client.gui.screen.IngameMenuScreen net.minecraft.client.gui.GuiIngameMenu -net.minecraft.client.gui.screen.MultiplayerScreen net.minecraft.client.gui.GuiMultiplayer -net.minecraft.client.gui.screen.WorldSelectionScreen net.minecraft.client.gui.GuiWorldSelection -# Note: GuiButton has been split into Button and Widget (now shared with e.g. checkboxes), -# most members are actually on the latter (there's also AbstractButton in the middle, but it isn't interesting) -net.minecraft.client.gui.widget.Widget net.minecraft.client.gui.GuiButton -net.minecraft.client.gui.widget.button.AbstractButton active net.minecraft.client.gui.GuiButton enabled -net.minecraft.client.gui.screen.MainMenuScreen net.minecraft.client.gui.GuiMainMenu -net.minecraft.client.gui.screen.MainMenuScreen realmsNotificationGui realmsNotification -net.minecraft.realms.RealmsScreenProxy net.minecraft.client.gui.GuiScreenRealmsProxy -net.minecraft.resource.ResourceNotFoundException net.minecraft.resources.ResourcePackFileNotFoundException -net.minecraft.resource.ResourcePack net.minecraft.resources.IResourcePack -net.minecraft.resource.ResourcePack findResources() getAllResourceLocations() -net.minecraft.resource.ResourcePack getNamespaces() getResourceNamespaces() -net.minecraft.resource.ResourceType net.minecraft.resources.ResourcePackType -net.minecraft.network.PacketDirection net.minecraft.network.EnumPacketDirection -net.minecraft.network.ProtocolType net.minecraft.network.EnumConnectionState -net.minecraft.network.IPacket net.minecraft.network.Packet -net.minecraft.client.gui.screen.DownloadTerrainScreen net.minecraft.client.gui.GuiDownloadTerrain -net.minecraft.client.gui.screen.AlertScreen net.minecraft.client.gui.GuiErrorScreen -net.minecraft.client.entity.player.RemoteClientPlayerEntity net.minecraft.client.entity.EntityOtherPlayerMP -net.minecraft.world.Difficulty net.minecraft.world.EnumDifficulty -net.minecraft.world.chunk.IChunkLightProvider net.minecraft.world.chunk.IChunkProvider -net.minecraft.profiler.IProfiler net.minecraft.profiler.Profiler -net.minecraft.client.renderer.GameRenderer net.minecraft.client.renderer.EntityRenderer -net.minecraft.client.renderer.GameRenderer firstPersonRenderer itemRenderer -net.minecraft.client.renderer.GameRenderer client mc -net.minecraft.client.renderer.GameRenderer render() updateCameraAndRender() -net.minecraft.client.renderer.GameRenderer applyCameraTransformations() setupCameraTransform() -net.minecraft.client.renderer.GameRenderer renderAboveClouds() renderCloudsCheck() -net.minecraft.client.renderer.GameRenderer func_215308_a() renderHand() -net.minecraft.client.renderer.WorldRenderer net.minecraft.client.renderer.RenderGlobal -net.minecraft.client.renderer.WorldRenderer setBlockBreakingProgress() sendBlockBreakProgress() -net.minecraft.client.renderer.WorldRenderer drawHighlightedBlockOutline() drawSelectionBox() -net.minecraft.client.renderer.WorldRenderer chunkBatcher renderDispatcher -net.minecraft.client.renderer.WorldRenderer chunkInfos renderInfos -net.minecraft.client.renderer.WorldRenderer chunkRenderers chunksToUpdate -net.minecraft.client.renderer.WorldRenderer terrainUpdateNecessary displayListEntitiesDirty -net.minecraft.client.renderer.WorldRenderer field_4076 renderEntitiesStartupCounter -net.minecraft.client.renderer.WorldRenderer setUpTerrain() setupTerrain() -net.minecraft.client.renderer.WorldRenderer setWorld() setWorldAndLoadRenderers() -net.minecraft.client.renderer.WorldRenderer reload() loadRenderers() -com.mojang.blaze3d.platform.GlStateManager popAttributes() popAttrib() -com.mojang.blaze3d.platform.GlStateManager disableColorLogicOp() disableColorLogic() -com.mojang.blaze3d.platform.GlStateManager disableTexture() disableTexture2D() -com.mojang.blaze3d.platform.GlStateManager enableColorLogicOp() enableColorLogic() -com.mojang.blaze3d.platform.GlStateManager enableTexture() enableTexture2D() -com.mojang.blaze3d.platform.GlStateManager enableAlphaTest() enableAlpha() -com.mojang.blaze3d.platform.GlStateManager activeTexture activeTextureUnit -com.mojang.blaze3d.platform.GlStateManager net.minecraft.client.renderer.GlStateManager -com.mojang.blaze3d.platform.GlStateManager.CapabilityTracker net.minecraft.client.renderer.GlStateManager.BooleanState -com.mojang.blaze3d.platform.GlStateManager.FogState net.minecraft.client.renderer.GlStateManager.FogState -com.mojang.blaze3d.platform.GlStateManager.FogState capState fog -com.mojang.blaze3d.platform.GlStateManager.Texture2DState net.minecraft.client.renderer.GlStateManager.Texture2DState -com.mojang.blaze3d.platform.GlStateManager.Texture2DState capState texture2DState -net.minecraft.SharedConstants isValidChar() isAllowedCharacter() -net.minecraft.SharedConstants net.minecraft.util.SharedConstants -net.minecraft.server.MinecraftServer getLevelName() getWorldName() -com.replaymod.core.versions.MCVer.Keyboard onKey() onKeyEvent() -com.replaymod.core.versions.MCVer.Keyboard pollDebugCrash() tick() -com.replaymod.core.versions.MCVer.Keyboard getClipboard() getClipboardString() -com.replaymod.core.versions.MCVer.Keyboard setClipboard() setClipboardString() -net.minecraft.client.gui.screen.ConfirmScreen net.minecraft.client.gui.GuiYesNo -net.minecraft.client.Mouse getX() getMouseX() -net.minecraft.client.Mouse getY() getMouseY() -net.minecraft.client.Mouse net.minecraft.client.MouseHelper -net.minecraft.client.Mouse isCursorLocked mouseGrabbed -net.minecraft.client.Mouse lockCursor() grabMouse() -net.minecraft.client.Mouse unlockCursor() ungrabMouse() -net.minecraft.client.Mouse isCursorLocked() isMouseGrabbed() -net.minecraft.client.Mouse onMouseScroll() scrollCallback() -net.minecraft.client.audio.PositionedSoundInstance master() getMasterRecord() -net.minecraft.client.audio.PositionedSoundInstance net.minecraft.client.audio.SimpleSound -net.minecraft.client.gui.DrawableHelper fill() drawRect() -net.minecraft.client.gui.DrawableHelper net.minecraft.client.gui.Gui -net.minecraft.client.gui.screen.Screen hasControlDown() isCtrlKeyDown() -net.minecraft.client.gui.screen.Screen hasShiftDown() isShiftKeyDown() -net.minecraft.client.gui.screen.Screen init() setWorldAndResolution() -net.minecraft.client.gui.screen.Screen minecraft mc -net.minecraft.client.gui.screen.Screen net.minecraft.client.gui.GuiScreen -net.minecraft.client.gui.screen.Screen passEvents allowUserInput -net.minecraft.client.gui.screen.Screen removed() onGuiClosed() -net.minecraft.client.gui.screen.Screen renderBackground() drawDefaultBackground() -net.minecraft.client.gui.screen.Screen renderDirtBackground() drawBackground() -net.minecraft.client.gui.hud.ChatHud net.minecraft.client.gui.GuiNewChat -net.minecraft.client.gui.hud.InGameHud net.minecraft.client.gui.GuiIngame -net.minecraft.client.GameSettings net.minecraft.client.settings.GameSettings -net.minecraft.client.GameSettings debugEnabled showDebugInfo -net.minecraft.client.GameSettings viewDistance renderDistanceChunks -net.minecraft.client.GameSettings hudHidden hideGUI -net.minecraft.client.GameSettings gamma gammaSetting -net.minecraft.client.GameSettings keysAll keyBindings -net.minecraft.client.GameSettings keyChat keyBindChat -net.minecraft.client.GameSettings keyCommand keyBindCommand -net.minecraft.client.GameSettings keyAttack keyBindAttack -net.minecraft.client.GameSettings keyUse keyBindUseItem -net.minecraft.client.GameSettings keySneak keyBindSneak -net.minecraft.client.GameSettings keyForward keyBindForward -net.minecraft.client.GameSettings keyBack keyBindBack -net.minecraft.client.GameSettings keyLeft keyBindLeft -net.minecraft.client.GameSettings keyRight keyBindRight -net.minecraft.client.GameSettings keyJump keyBindJump -net.minecraft.client.util.Window getScaleFactor() getGuiScaleFactor() -net.minecraft.client.util.Window setFullscreen() update() -net.minecraft.client.util.Window method_4493() setupOverlayRendering() -net.minecraft.client.util.Window net.minecraft.client.MainWindow -net.minecraft.resources.AbstractResourcePack net.minecraft.resources.AbstractResourcePack -net.minecraft.resources.AbstractResourcePack containsFile() resourceExists() -net.minecraft.resources.AbstractResourcePack base file -net.minecraft.resource.ResourcePackContainer net.minecraft.resources.ResourcePackInfo -net.minecraft.resource.ResourcePackContainer.Factory net.minecraft.resources.ResourcePackInfo.IFactory -net.minecraft.resource.ResourcePackContainer.InsertionPosition net.minecraft.resources.ResourcePackInfo.Priority -net.minecraft.resource.ResourcePackContainer of() func_195793_a() -net.minecraft.resource.ResourcePackContainerManager net.minecraft.resources.ResourcePackList -net.minecraft.resource.ResourcePackContainerManager addCreator() addPackFinder() -net.minecraft.resource.ResourcePackCreator net.minecraft.resources.IPackFinder -net.minecraft.resource.ResourcePackCreator registerContainer() addPackInfosToMap() -net.minecraft.world.World getGeneratorType() getWorldType() -net.minecraft.world.IEntityReader getPlayerByUuid() net.minecraft.world.World getPlayerEntityByUUID() -net.minecraft.client.renderer.entity.EntityRendererManager net.minecraft.client.renderer.entity.RenderManager -net.minecraft.client.renderer.entity.EntityRendererManager cameraYaw playerViewY -net.minecraft.client.renderer.entity.EntityRendererManager cameraPitch playerViewX -net.minecraft.client.renderer.entity.EntityRendererManager configure() cacheActiveRenderInfo() -net.minecraft.client.renderer.entity.EntityRendererManager render() renderEntityStatic() -net.minecraft.client.util.InputUtil net.minecraft.client.util.InputMappings -net.minecraft.client.util.InputUtil isKeyPressed() isKeyDown() -net.minecraft.client.util.InputUtil$KeyCode net.minecraft.client.util.InputMappings$Input -net.minecraft.client.resources.DownloadingPackFinder func_217818_a() downloadResourcePack() -net.minecraft.client.resources.DownloadingPackFinder func_217816_a() setServerResourcePack() -net.minecraft.client.entity.player.ClientPlayerEntity net.minecraft.client.entity.EntityPlayerSP -net.minecraft.client.entity.player.ClientPlayerEntity client mc -net.minecraft.client.entity.player.ClientPlayerEntity renderYaw renderArmYaw -net.minecraft.client.entity.player.ClientPlayerEntity renderPitch renderArmPitch -net.minecraft.client.entity.player.ClientPlayerEntity lastRenderYaw prevRenderArmYaw -net.minecraft.client.entity.player.ClientPlayerEntity lastRenderPitch prevRenderArmPitch -net.minecraft.client.entity.player.AbstractClientPlayerEntity net.minecraft.client.entity.AbstractClientPlayer -net.minecraft.client.network.login.ClientLoginNetHandler net.minecraft.client.network.NetHandlerLoginClient -net.minecraft.client.network.login.ClientLoginNetHandler connection networkManager -net.minecraft.client.network.login.ClientLoginNetHandler onQueryRequest() func_209521_a() -net.minecraft.client.network.login.ClientLoginNetHandler onLoginSuccess() handleLoginSuccess() -net.minecraft.client.network.play.ClientPlayNetHandler net.minecraft.client.network.NetHandlerPlayClient -net.minecraft.client.network.play.ClientPlayNetHandler playerListEntries playerInfoMap -net.minecraft.client.network.play.ClientPlayNetHandler onPlayerList() handlePlayerListItem() -net.minecraft.client.network.play.ClientPlayNetHandler onPlayerRespawn() handleRespawn() -net.minecraft.client.network.play.NetworkPlayerInfo net.minecraft.client.network.NetworkPlayerInfo -net.minecraft.entity.item.ItemFrameEntity net.minecraft.entity.item.EntityItemFrame -net.minecraft.entity.player.PlayerEntity net.minecraft.entity.player.EntityPlayer -net.minecraft.entity.player.PlayerEntity selectedItem itemStackMainHand -net.minecraft.entity.player.PlayerEntity isSleeping() isPlayerSleeping() -net.minecraft.entity.MobEntity net.minecraft.entity.EntityLiving -net.minecraft.entity.LivingEntity net.minecraft.entity.EntityLivingBase -net.minecraft.entity.LivingEntity headYaw rotationYawHead -net.minecraft.entity.LivingEntity prevHeadYaw prevRotationYawHead -net.minecraft.entity.LivingEntity isHandSwinging isSwingInProgress -net.minecraft.entity.LivingEntity handSwingTicks swingProgressInt -net.minecraft.entity.LivingEntity preferredHand swingingHand -net.minecraft.entity.LivingEntity itemUseTimeLeft activeItemStackUseCount -net.minecraft.entity.LivingEntity field_6224 interpTargetX -net.minecraft.entity.LivingEntity field_6245 interpTargetY -net.minecraft.entity.LivingEntity field_6263 interpTargetZ -net.minecraft.entity.LivingEntity field_6284 interpTargetYaw -net.minecraft.entity.LivingEntity field_6221 interpTargetPitch -net.minecraft.entity.LivingEntity isSleeping() isPlayerSleeping() -net.minecraft.entity.LivingEntity tickMovement() livingTick() -net.minecraft.entity.Entity afterSpawn() preparePlayerToSpawn() -net.minecraft.entity.Entity spawnSprintingParticles() createRunningParticles() -net.minecraft.entity.Entity isRowingBoat() isRiding() -net.minecraft.entity.Entity updateNeeded addedToChunk -net.minecraft.entity.Entity chunkX chunkCoordX -net.minecraft.entity.Entity chunkY chunkCoordY -net.minecraft.entity.Entity chunkZ chunkCoordZ -net.minecraft.entity.Entity x posX -net.minecraft.entity.Entity y posY -net.minecraft.entity.Entity z posZ -net.minecraft.entity.Entity yaw rotationYaw -net.minecraft.entity.Entity pitch rotationPitch -net.minecraft.entity.Entity prevX prevPosX -net.minecraft.entity.Entity prevY prevPosY -net.minecraft.entity.Entity prevZ prevPosZ -net.minecraft.entity.Entity prevYaw prevRotationYaw -net.minecraft.entity.Entity prevPitch prevRotationPitch -net.minecraft.entity.Entity prevRenderX lastTickPosX -net.minecraft.entity.Entity prevRenderY lastTickPosY -net.minecraft.entity.Entity prevRenderZ lastTickPosZ -net.minecraft.util.math.RayTraceContext net.minecraft.util.math.RayTraceResult -net.minecraft.inventory.EquipmentSlotType net.minecraft.inventory.EntityEquipmentSlot -net.minecraft.client.recipe.book.ClientRecipeBook net.minecraft.client.util.RecipeBookClient -net.minecraft.util.Hand net.minecraft.util.EnumHand -net.minecraft.client.renderer.model.ModelBox net.minecraft.client.model.ModelBox -net.minecraft.client.renderer.entity.model.RendererModel net.minecraft.client.model.ModelRenderer -net.minecraft.client.renderer.entity.model.RendererModel boxes cubeList -net.minecraft.client.renderer.entity.model.RendererModel name boxName -net.minecraft.client.renderer.entity.model.RendererModel method_2852() renderWithRotation() -net.minecraft.client.renderer.texture.AtlasTexture net.minecraft.client.renderer.texture.TextureMap -net.minecraft.client.renderer.texture.AtlasTexture BLOCK_ATLAS_TEX LOCATION_BLOCKS_TEXTURE -net.minecraft.client.world.ClientWorld net.minecraft.client.multiplayer.WorldClient -net.minecraft.client.world.ClientWorld client mc -net.minecraft.client.world.ClientWorld disconnect() sendQuittingDisconnectingPacket() - -#net.minecraft.client.network.packet net.minecraft.network.play.server -net.minecraft.network.login.server.SCustomPayloadLoginPacket net.minecraft.network.login.server.SPacketCustomPayloadLogin -net.minecraft.network.login.server.SEnableCompressionPacket net.minecraft.network.login.server.SPacketEnableCompression -net.minecraft.network.login.server.SLoginSuccessPacket net.minecraft.network.login.server.SPacketLoginSuccess -net.minecraft.network.play.server.SJoinGamePacket net.minecraft.network.play.server.SPacketJoinGame -net.minecraft.client.network.packet.GameJoinS2CPacket getEntityId() getPlayerId() -net.minecraft.client.network.packet.GameJoinS2CPacket getDimension() func_212642_e() -net.minecraft.client.network.packet.GameJoinS2CPacket getDifficulty() getDifficulty() -net.minecraft.network.play.server.SChatPacket net.minecraft.network.play.server.SPacketChat -net.minecraft.network.play.server.SSpawnParticlePacket net.minecraft.network.play.server.SPacketParticles -net.minecraft.network.play.server.SChangeGameStatePacket net.minecraft.network.play.server.SPacketChangeGameState -net.minecraft.client.network.packet.GameStateChangeS2CPacket getReason() getGameState() -net.minecraft.network.play.server.SPlayerPositionLookPacket net.minecraft.network.play.server.SPacketPlayerPosLook -net.minecraft.network.play.server.SPlayerPositionLookPacket.Flag net.minecraft.network.play.server.SPacketPlayerPosLook.EnumFlags -net.minecraft.network.play.server.SPlayerListItemPacket net.minecraft.network.play.server.SPacketPlayerListItem -net.minecraft.network.play.server.SPlayerListItemPacket.Action net.minecraft.network.play.server.SPacketPlayerListItem.Action -net.minecraft.network.play.server.SPlayerListItemPacket.Entry net.minecraft.network.play.server.SPacketPlayerListItem.AddPlayerData -net.minecraft.network.play.server.SRespawnPacket net.minecraft.network.play.server.SPacketRespawn -net.minecraft.network.play.server.SSpawnPlayerPacket net.minecraft.network.play.server.SPacketSpawnPlayer -net.minecraft.client.network.packet.PlayerSpawnS2CPacket getPlayerUuid() getUniqueId() -net.minecraft.client.network.packet.PlayerSpawnS2CPacket getTrackedValues() getDataManagerEntries() -net.minecraft.client.network.packet.PlayerSpawnS2CPacket dataTracker watcher -net.minecraft.network.play.server.SSpawnObjectPacket net.minecraft.network.play.server.SPacketSpawnObject -net.minecraft.network.play.server.SSpawnMobPacket net.minecraft.network.play.server.SPacketSpawnMob -net.minecraft.client.network.packet.MobSpawnS2CPacket getTrackedValues() getDataManagerEntries() -net.minecraft.client.network.packet.MobSpawnS2CPacket dataTracker dataManager -net.minecraft.network.play.server.SSpawnGlobalEntityPacket net.minecraft.network.play.server.SPacketSpawnGlobalEntity -net.minecraft.network.play.server.SSpawnPaintingPacket net.minecraft.network.play.server.SPacketSpawnPainting -net.minecraft.network.play.server.SSpawnExperienceOrbPacket net.minecraft.network.play.server.SPacketSpawnExperienceOrb -net.minecraft.network.play.server.SDestroyEntitiesPacket net.minecraft.network.play.server.SPacketDestroyEntities -net.minecraft.network.play.server.SEntityTeleportPacket net.minecraft.network.play.server.SPacketEntityTeleport -net.minecraft.network.play.server.SEntityHeadLookPacket net.minecraft.network.play.server.SPacketEntityHeadLook -net.minecraft.network.play.server.SEntityVelocityPacket net.minecraft.network.play.server.SPacketEntityVelocity -net.minecraft.network.play.server.SMountEntityPacket net.minecraft.network.play.server.SPacketEntityAttach -net.minecraft.network.play.server.SAnimateHandPacket net.minecraft.network.play.server.SPacketAnimation -net.minecraft.network.play.server.SCollectItemPacket net.minecraft.network.play.server.SPacketCollectItem -net.minecraft.client.network.packet.ItemPickupAnimationS2CPacket getEntityId() getEntityID() -net.minecraft.network.play.server.SAnimateBlockBreakPacket net.minecraft.network.play.server.SPacketBlockBreakAnim -net.minecraft.network.play.client.CResourcePackStatusPacket net.minecraft.network.play.client.CPacketResourcePackStatus -net.minecraft.network.play.client.CResourcePackStatusPacket.Status net.minecraft.network.play.client.CPacketResourcePackStatus.Action -net.minecraft.network.play.server.SSendResourcePackPacket net.minecraft.network.play.server.SPacketResourcePackSend -net.minecraft.client.network.packet.ResourcePackSendS2CPacket getSHA1() getHash() -net.minecraft.network.play.server.SCustomPayloadPlayPacket net.minecraft.network.play.server.SPacketCustomPayload -net.minecraft.client.network.packet.CustomPayloadS2CPacket getChannel() getChannelName() -net.minecraft.client.network.packet.CustomPayloadS2CPacket getData() getBufferData() -net.minecraft.network.play.server.SDisconnectPacket net.minecraft.network.play.server.SPacketDisconnect -net.minecraft.network.login.server.SLoginSuccessPacket net.minecraft.network.login.server.SPacketLoginSuccess -net.minecraft.network.play.server.SUpdateRecipesPacket net.minecraft.network.play.server.SPacketRecipeBook -net.minecraft.network.play.server.SAdvancementInfoPacket net.minecraft.network.play.server.SPacketAdvancementInfo -net.minecraft.network.play.server.SSelectAdvancementsTabPacket net.minecraft.network.play.server.SPacketSelectAdvancementsTab -net.minecraft.network.play.server.SUpdateHealthPacket net.minecraft.network.play.server.SPacketUpdateHealth -net.minecraft.network.play.server.SOpenHorseWindowPacket net.minecraft.network.play.server.SPacketOpenWindow -net.minecraft.network.play.server.SCloseWindowPacket net.minecraft.network.play.server.SPacketCloseWindow -net.minecraft.network.play.server.SSetSlotPacket net.minecraft.network.play.server.SPacketSetSlot -net.minecraft.network.play.server.SWindowPropertyPacket net.minecraft.network.play.server.SPacketWindowItems -net.minecraft.network.play.server.SOpenSignMenuPacket net.minecraft.network.play.server.SPacketSignEditorOpen -net.minecraft.network.play.server.SStatisticsPacket net.minecraft.network.play.server.SPacketStatistics -net.minecraft.network.play.server.SSetExperiencePacket net.minecraft.network.play.server.SPacketSetExperience -net.minecraft.network.play.server.SCameraPacket net.minecraft.network.play.server.SPacketCamera -net.minecraft.network.play.server.SPlayerAbilitiesPacket net.minecraft.network.play.server.SPacketPlayerAbilities -net.minecraft.network.play.server.STitlePacket net.minecraft.network.play.server.SPacketTitle -net.minecraft.network.play.server.SUnloadChunkPacket net.minecraft.network.play.server.SPacketUnloadChunk -net.minecraft.network.play.server.SPlaySoundEffectPacket net.minecraft.network.play.server.SPacketSoundEffect -net.minecraft.network.play.server.SPlaySoundEventPacket net.minecraft.network.play.server.SPacketEffect -net.minecraft.network.play.server.SEntityMetadataPacket net.minecraft.network.play.server.SPacketEntityMetadata -net.minecraft.network.play.server.SEntityEquipmentPacket net.minecraft.network.play.server.SPacketEntityEquipment -net.minecraft.network.play.server.SEntityPacket net.minecraft.network.play.server.SPacketEntity -net.minecraft.network.play.server.SEntityPacket.Rotate net.minecraft.network.play.server.SPacketEntity.Look -net.minecraft.network.play.server.SEntityPacket.MoveRelative net.minecraft.network.play.server.SPacketEntity.RelMove -net.minecraft.network.play.server.SEntityPacket.MovePacket net.minecraft.network.play.server.SPacketEntity.Move diff --git a/versions/1.14.4-forge/src/main/java/com/replaymod/core/ReplayModBackend.java b/versions/1.14.4-forge/src/main/java/com/replaymod/core/ReplayModBackend.java deleted file mode 100644 index 2ba2eab7..00000000 --- a/versions/1.14.4-forge/src/main/java/com/replaymod/core/ReplayModBackend.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.replaymod.core; - -import net.minecraft.client.Minecraft; -import net.minecraftforge.fml.ModList; - -import static com.replaymod.core.ReplayMod.MOD_ID; - -public class ReplayModBackend { - public String getVersion() { - return ModList.get().getModContainerById(MOD_ID).get().getModInfo().getVersion().toString(); - } - - public String getMinecraftVersion() { - return Minecraft.getInstance().getMinecraftGame().getVersion().getName(); - } - - public boolean isModLoaded(String id) { - return ModList.get().isLoaded(id.toLowerCase()); - } -} diff --git a/versions/1.14.4-forge/src/main/java/com/replaymod/core/utils/ModInfoGetter.java b/versions/1.14.4-forge/src/main/java/com/replaymod/core/utils/ModInfoGetter.java deleted file mode 100644 index 7bb66d98..00000000 --- a/versions/1.14.4-forge/src/main/java/com/replaymod/core/utils/ModInfoGetter.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.replaymod.core.utils; - -import com.replaymod.replaystudio.data.ModInfo; - -import java.util.Collection; - -class ModInfoGetter { - static Collection getInstalledNetworkMods() { - throw new UnsupportedOperationException(); - } -} diff --git a/versions/1.14.4/.gitkeep b/versions/1.14.4/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.14.4/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java b/versions/1.14.4/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java deleted file mode 100644 index 181c7fc1..00000000 --- a/versions/1.14.4/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.replaymod.render.hooks; - -import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor; -import com.replaymod.render.mixin.WorldRendererAccessor; -import com.replaymod.render.utils.JailingQueue; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.render.chunk.BlockBufferBuilderStorage; -import net.minecraft.client.render.chunk.ChunkBuilder; -import net.minecraft.client.render.chunk.ChunkRenderTask; -import net.minecraft.client.render.chunk.ChunkRenderWorker; -import net.minecraft.client.render.chunk.ChunkRenderer; - -import java.util.Iterator; - -//#if MC>=10904 -import java.util.concurrent.PriorityBlockingQueue; -//#else -//$$ import java.util.concurrent.BlockingQueue; -//#endif - -import static com.replaymod.core.versions.MCVer.ChunkRenderWorkerAccessor; - -public class ForceChunkLoadingHook { - - private final WorldRenderer hooked; - - private ChunkBuilder renderDispatcher; - //#if MC>=11400 - private JailingQueue workerJailingQueue; - //#else - //$$ private JailingQueue workerJailingQueue; - //#endif - private ChunkRenderWorkerAccessor renderWorker; - private int frame; - - public ForceChunkLoadingHook(WorldRenderer renderGlobal) { - this.hooked = renderGlobal; - - setup(((WorldRendererAccessor) renderGlobal).getRenderDispatcher()); - IForceChunkLoading.from(renderGlobal).replayModRender_setHook(this); - } - - public void updateRenderDispatcher(ChunkBuilder renderDispatcher) { - if (this.renderDispatcher != null) { - workerJailingQueue.freeAll(); - this.renderDispatcher = null; - } - if (renderDispatcher != null) { - setup(renderDispatcher); - } - } - - private void setup(ChunkBuilder renderDispatcher) { - this.renderDispatcher = renderDispatcher; - this.renderWorker = (ChunkRenderWorkerAccessor) new ChunkRenderWorker(renderDispatcher, new BlockBufferBuilderStorage()); - ChunkRenderDispatcherAccessor renderDispatcherAcc = (ChunkRenderDispatcherAccessor) renderDispatcher; - - int workerThreads = renderDispatcherAcc.getListThreadedWorkers().size(); - //#if MC>=10904 - PriorityBlockingQueue queueChunkUpdates = renderDispatcherAcc.getQueueChunkUpdates(); - //#else - //$$ BlockingQueue queueChunkUpdates = renderDispatcherAcc.getQueueChunkUpdates(); - //#endif - workerJailingQueue = new JailingQueue<>(queueChunkUpdates); - renderDispatcherAcc.setQueueChunkUpdates(workerJailingQueue); - //#if MC>=10904 - ChunkRenderTask element = new ChunkRenderTask( - null, - null, - 0 - //#if MC>=11400 - , null - //#endif - ); - //#else - //$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null); - //#endif - element.cancel(); - for (int i = 0; i < workerThreads; i++) { - queueChunkUpdates.add(element); - } - - // Temporary workaround for dead lock, will be replaced by a new (ShaderMod compatible) mechanism later - //noinspection StatementWithEmptyBody - while (renderDispatcher.runTasksSync(0)) {} - - workerJailingQueue.jail(workerThreads); - renderDispatcherAcc.setQueueChunkUpdates(queueChunkUpdates); - } - - public void updateChunks() { - while (renderDispatcher.runTasksSync(0)) { - ((WorldRendererAccessor) hooked).setDisplayListEntitiesDirty(true); - } - - //#if MC>=10904 - PriorityBlockingQueue queueChunkUpdates; - //#else - //$$ BlockingQueue queueChunkUpdates; - //#endif - queueChunkUpdates = ((ChunkRenderDispatcherAccessor) renderDispatcher).getQueueChunkUpdates(); - while (!queueChunkUpdates.isEmpty()) { - try { - renderWorker.doRunTask(queueChunkUpdates.poll()); - } catch (InterruptedException ignored) { } - } - - Iterator iterator = ((WorldRendererAccessor) hooked).getChunksToUpdate().iterator(); - while (iterator.hasNext()) { - ChunkRenderer renderchunk = iterator.next(); - - renderDispatcher.rebuildSync(renderchunk); - - //#if MC>=10904 - renderchunk.unscheduleRebuild(); - //#else - //$$ renderchunk.setNeedsUpdate(false); - //#endif - iterator.remove(); - } - } - - public int nextFrameId() { - return frame++; - } - - public void uninstall() { - workerJailingQueue.freeAll(); - IForceChunkLoading.from(hooked).replayModRender_setHook(null); - } -} diff --git a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/ChunkRenderDispatcherAccessor.java b/versions/1.14.4/src/main/java/com/replaymod/render/mixin/ChunkRenderDispatcherAccessor.java deleted file mode 100644 index 2c62b138..00000000 --- a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/ChunkRenderDispatcherAccessor.java +++ /dev/null @@ -1,34 +0,0 @@ -//#if MC>=10800 -package com.replaymod.render.mixin; - -import net.minecraft.client.render.chunk.ChunkBuilder; -import net.minecraft.client.render.chunk.ChunkRenderTask; -import net.minecraft.client.render.chunk.ChunkRenderWorker; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; -//#if MC>=10904 -import java.util.concurrent.PriorityBlockingQueue; -//#else -//$$ import java.util.concurrent.BlockingQueue; -//#endif - -@Mixin(ChunkBuilder.class) -public interface ChunkRenderDispatcherAccessor { - @Accessor("workers") - List getListThreadedWorkers(); - - //#if MC>=10904 - @Accessor("pendingChunks") - PriorityBlockingQueue getQueueChunkUpdates(); - @Accessor("pendingChunks") - void setQueueChunkUpdates(PriorityBlockingQueue value); - //#else - //$$ @Accessor - //$$ BlockingQueue getQueueChunkUpdates(); - //$$ @Accessor - //$$ void setQueueChunkUpdates(BlockingQueue value); - //#endif -} -//#endif diff --git a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/MixinChunkRenderWorker.java b/versions/1.14.4/src/main/java/com/replaymod/render/mixin/MixinChunkRenderWorker.java deleted file mode 100644 index 6e4a2a00..00000000 --- a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/MixinChunkRenderWorker.java +++ /dev/null @@ -1,18 +0,0 @@ -//#if MC>=10800 -package com.replaymod.render.mixin; - -import com.replaymod.core.versions.MCVer; -import net.minecraft.client.render.chunk.ChunkRenderTask; -import net.minecraft.client.render.chunk.ChunkRenderWorker; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(ChunkRenderWorker.class) -public abstract class MixinChunkRenderWorker implements MCVer.ChunkRenderWorkerAccessor { - @Shadow abstract void runTask(ChunkRenderTask task) throws InterruptedException; - - public void doRunTask(ChunkRenderTask task) throws InterruptedException { - runTask(task); - } -} -//#endif diff --git a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java b/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java deleted file mode 100644 index 92120a32..00000000 --- a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.replaymod.render.mixin; - -//#if MC>=10800 -import com.replaymod.compat.shaders.ShaderReflection; -import com.replaymod.render.hooks.ForceChunkLoadingHook; -import com.replaymod.render.hooks.IForceChunkLoading; -import net.minecraft.client.render.VisibleRegion; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.render.chunk.ChunkBuilder; -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; - -//#if MC>=11400 -import net.minecraft.client.render.Camera; -//#else -//$$ import net.minecraft.entity.Entity; -//#endif - -//#if MC<10904 -//$$ import net.minecraft.client.renderer.chunk.RenderChunk; -//$$ import net.minecraft.util.BlockPos; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#endif - -@Mixin(WorldRenderer.class) -public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { - private ForceChunkLoadingHook replayModRender_hook; - - @Override - public void replayModRender_setHook(ForceChunkLoadingHook hook) { - this.replayModRender_hook = hook; - } - - private boolean replayModRender_passThroughSetupTerrain; - - @Shadow - private boolean needsTerrainUpdate; - - @Shadow - private ChunkBuilder chunkBuilder; - - @Shadow - public abstract void setUpTerrain( - //#if MC>=11400 - Camera viewEntity, - //#else - //$$ Entity viewEntity, - //$$ double partialTicks, - //#endif - VisibleRegion camera, - int frameCount, - boolean playerSpectator - ); - - @Inject(method = "setUpTerrain", at = @At("HEAD"), cancellable = true) - private void replayModRender_setupTerrain( - //#if MC>=11400 - Camera viewEntity, - //#else - //$$ Entity viewEntity, - //$$ double partialTicks, - //#endif - VisibleRegion camera, - int frameCount, - boolean playerSpectator, - CallbackInfo ci - ) throws IllegalAccessException { - if (ShaderReflection.shaders_isShadowPass != null && (boolean) ShaderReflection.shaders_isShadowPass.get(null)) { - return; - } - if (replayModRender_hook != null && !replayModRender_passThroughSetupTerrain) { - replayModRender_passThroughSetupTerrain = true; - - do { - setUpTerrain( - viewEntity, - //#if MC<11400 - //$$ partialTicks, - //#endif - camera, - replayModRender_hook.nextFrameId(), - playerSpectator - ); - replayModRender_hook.updateChunks(); - } while (this.needsTerrainUpdate); - - this.needsTerrainUpdate = true; - - replayModRender_passThroughSetupTerrain = false; - ci.cancel(); - } - } - - //#if MC<10904 - //$$ @Inject(method = "isPositionInRenderChunk", at = @At("HEAD"), cancellable = true) - //$$ public void replayModRender_isPositionInRenderChunk(BlockPos pos, RenderChunk chunk, CallbackInfoReturnable ci) { - //$$ if (replayModRender_hook != null) { - //$$ ci.setReturnValue(true); - //$$ } - //$$ } - //#endif - - @Inject(method = "updateChunks", at = @At("HEAD"), cancellable = true) - public void replayModRender_updateChunks(long finishTimeNano, CallbackInfo ci) { - if (replayModRender_hook != null) { - replayModRender_hook.updateChunks(); - ci.cancel(); - } - } - - // Prior to 1.9.4, MC always uses the same ChunkRenderDispatcher instance - //#if MC>=10904 - @Inject(method = "setWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/chunk/ChunkBuilder;stop()V")) - private void stopWorkerThreadsAndChunkLoadingRenderGlobal(CallbackInfo ci) { - if (replayModRender_hook != null) { - replayModRender_hook.updateRenderDispatcher(null); - } - } - //#endif - - @Inject(method = "reload", at = @At(value = "RETURN")) - private void setupChunkLoadingRenderGlobal(CallbackInfo ci) { - if (replayModRender_hook != null) { - replayModRender_hook.updateRenderDispatcher(this.chunkBuilder); - } - } -} -//#endif diff --git a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java b/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java deleted file mode 100644 index 6a0dd1e4..00000000 --- a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.replaymod.render.mixin; - -import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.Matrix4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(GameRenderer.class) -public abstract class Mixin_Omnidirectional_Camera implements EntityRendererHandler.IEntityRenderer { - @Redirect(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;")) - private Matrix4f replayModRender_perspective$0(double fovY, float aspect, float zNear, float zFar) { - return replayModRender_perspective((float) fovY, aspect, zNear, zFar); - } - - @Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;")) - private Matrix4f replayModRender_perspective$1(double fovY, float aspect, float zNear, float zFar) { - return replayModRender_perspective((float) fovY, aspect, zNear, zFar); - } - - @Redirect(method = "renderAboveClouds", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;")) - private Matrix4f replayModRender_perspective$2(double fovY, float aspect, float zNear, float zFar) { - return replayModRender_perspective((float) fovY, aspect, zNear, zFar); - } - - private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNear, float zFar) { - if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { - fovY = 90; - aspect = 1; - } - return Matrix4f.method_4929(fovY, aspect, zNear, zFar); - } -} diff --git a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java b/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java deleted file mode 100644 index 400e80e7..00000000 --- a/versions/1.14.4/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.replaymod.render.mixin; - -import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; -import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.render.GameRenderer; -import org.lwjgl.opengl.GL11; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(GameRenderer.class) -public abstract class Mixin_Stereoscopic_Camera implements EntityRendererHandler.IEntityRenderer { - //#if MC>=10800 - @Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 0)) - //#else - //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 0, remap = false)) - //#endif - private void replayModRender_setupStereoscopicProjection(CallbackInfo ci) { - if (replayModRender_getHandler() != null) { - if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { - GL11.glTranslatef(0.07f, 0, 0); - } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { - GL11.glTranslatef(-0.07f, 0, 0); - } - } - } - - //#if MC>=10800 - @Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 1)) - //#else - //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 1, remap = false)) - //#endif - private void replayModRender_setupStereoscopicModelView(CallbackInfo ci) { - if (replayModRender_getHandler() != null) { - if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { - GL11.glTranslatef(0.1f, 0, 0); - } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { - GL11.glTranslatef(-0.1f, 0, 0); - } - } - } -} diff --git a/versions/1.14.4/src/main/java/com/replaymod/replay/mixin/MixinCamera.java b/versions/1.14.4/src/main/java/com/replaymod/replay/mixin/MixinCamera.java deleted file mode 100644 index a0c0d58a..00000000 --- a/versions/1.14.4/src/main/java/com/replaymod/replay/mixin/MixinCamera.java +++ /dev/null @@ -1,30 +0,0 @@ -//#if MC>=11400 -package com.replaymod.replay.mixin; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.replaymod.replay.camera.CameraEntity; -import net.minecraft.client.render.Camera; -import net.minecraft.entity.Entity; -import net.minecraft.world.BlockView; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Camera.class) -public class MixinCamera { - @Inject( - method = "update", - at = @At( - value = "INVOKE", - target = "Lcom/mojang/blaze3d/platform/GlStateManager;rotatef(FFFF)V", - ordinal = 0 - ) - ) - private void applyRoll(BlockView blockView, Entity view, boolean boolean_1, boolean boolean_2, float float_1, CallbackInfo ci) { - if (view instanceof CameraEntity) { - GlStateManager.rotatef(((CameraEntity) view).roll, 0.0F, 0.0F, 1.0F); - } - } -} -//#endif diff --git a/versions/1.15.2/.gitkeep b/versions/1.15.2/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.16.1/.gitkeep b/versions/1.16.1/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.16.4-forge/.gitkeep b/versions/1.16.4-forge/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.16.4-forge/src/main/java/com/replaymod/core/ReplayModBackend.java b/versions/1.16.4-forge/src/main/java/com/replaymod/core/ReplayModBackend.java deleted file mode 100644 index 43a32254..00000000 --- a/versions/1.16.4-forge/src/main/java/com/replaymod/core/ReplayModBackend.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.replaymod.core; - -import com.mojang.bridge.launcher.Launcher; -import com.replaymod.mixin.MinecraftAccessor; -import com.replaymod.core.versions.forge.EventsAdapter; -import com.replaymod.extras.modcore.ModCoreInstaller; -import net.minecraft.resources.IResourcePack; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.javafmlmod.FMLModContainer; -import org.spongepowered.asm.launch.MixinBootstrap; -import org.spongepowered.asm.mixin.MixinEnvironment; -import org.spongepowered.asm.mixin.Mixins; - -import java.util.List; - -import static com.replaymod.core.ReplayMod.MOD_ID; -import static com.replaymod.core.ReplayMod.jGuiResourcePack; -import static com.replaymod.core.versions.MCVer.getMinecraft; - -@Mod(ReplayMod.MOD_ID) -public class ReplayModBackend { - private final ReplayMod mod = new ReplayMod(this); - private final EventsAdapter eventsAdapter = new EventsAdapter(); - - // @Deprecated - // public static Configuration config; - - public ReplayModBackend() { - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::init); - } - - public void init(FMLCommonSetupEvent event) { - mod.initModules(); - eventsAdapter.register(); - // config = new Configuration(event.getSuggestedConfigurationFile()); - // config.load(); - // SettingsRegistry settingsRegistry = mod.getSettingsRegistry(); - // settingsRegistry.backend.setConfiguration(config); - // settingsRegistry.save(); // Save default values to disk - } - - public String getVersion() { - return "2.5.1"; - } - - public String getMinecraftVersion() { - return "1.16.4"; - } - - public boolean isModLoaded(String id) { - return ModList.get().isLoaded(id); - } -} diff --git a/versions/1.16.4-forge/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java b/versions/1.16.4-forge/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java deleted file mode 100644 index 0e4bb1ae..00000000 --- a/versions/1.16.4-forge/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.replaymod.core.tweaker; - -/* -import com.replaymod.extras.modcore.ModCoreInstaller; -import net.minecraft.launchwrapper.ITweaker; -import net.minecraft.launchwrapper.Launch; -import net.minecraft.launchwrapper.LaunchClassLoader; -import org.spongepowered.asm.launch.GlobalProperties; -import org.spongepowered.asm.launch.MixinBootstrap; -import org.spongepowered.asm.launch.platform.MixinPlatformManager; - -import java.io.File; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; - -//#if MC>=11200 -import org.spongepowered.asm.launch.platform.container.ContainerHandleURI; -//#endif - -// Fabric equivalent is in ReplayModMMLauncher -public class ReplayModTweaker implements ITweaker { - - private static final String MIXIN_TWEAKER = "org.spongepowered.asm.launch.MixinTweaker"; - - public ReplayModTweaker() { - injectMixinTweaker(); - } - - private void injectMixinTweaker() { - @SuppressWarnings("unchecked") - List tweakClasses = (List) Launch.blackboard.get("TweakClasses"); - - // If the MixinTweaker is already queued (because of anothe r mod), then there's nothing we need to to - if (tweakClasses.contains(MIXIN_TWEAKER)) { - return; - } - - // If it is already booted, we're also good to go - if (GlobalProperties.get(GlobalProperties.Keys.INIT) != null) { - return; - } - - System.out.println("Injecting MixinTweaker from ReplayModTweaker"); - - // Otherwise, we need to take things into our own hands because the normal way to chainload a tweaker - // (by adding it to the TweakClasses list during injectIntoClassLoader) is too late for Mixin. - // Instead we instantiate the MixinTweaker on our own and add it to the current Tweaks list immediately. - Launch.classLoader.addClassLoaderExclusion(MIXIN_TWEAKER.substring(0, MIXIN_TWEAKER.lastIndexOf('.'))); - @SuppressWarnings("unchecked") - List tweaks = (List) Launch.blackboard.get("Tweaks"); - try { - tweaks.add((ITweaker) Class.forName(MIXIN_TWEAKER, true, Launch.classLoader).newInstance()); - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - @Override - public void acceptOptions(List args, File gameDir, File assetsDir, String profile) { - } - - @Override - public void injectIntoClassLoader(LaunchClassLoader classLoader) { - // Add our jar as a Mixin container (cause normally Mixin detects those via the TweakClass manifest entry) - URI uri; - try { - uri = this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI(); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - MixinPlatformManager platform = MixinBootstrap.getPlatform(); - //#if MC>=11200 - platform.addContainer(new ContainerHandleURI(uri)); - //#else - //$$ platform.addContainer(uri); - //#endif - - //#if MC>=11202 && MC<=11202 - initModCore("1.12.2"); - //#endif - //#if MC>=10809 && MC<=10809 - //$$ initModCore("1.8.9"); - //#endif - } - - @Override - public String getLaunchTarget() { - return null; - } - - @Override - public String[] getLaunchArguments() { - return new String[0]; - } - - private void initModCore(String mcVer) { - try { - if (System.getProperty("REPLAYMOD_SKIP_MODCORE", "false").equalsIgnoreCase("true")) { - System.out.println("ReplayMod not initializing ModCore because REPLAYMOD_SKIP_MODCORE is true."); - return; - } - - if ((Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment")) { - System.out.println("ReplayMod not initializing ModCore because we're in a development environment."); - return; - } - - int result = ModCoreInstaller.initialize(Launch.minecraftHome, mcVer + "_forge"); - if (result != -2) { // Don't even bother logging the result if there's no ModCore for this version. - System.out.println("ReplayMod ModCore init result: " + result); - } - if (ModCoreInstaller.isErrored()) { - System.err.println(ModCoreInstaller.getError()); - } - } catch (Throwable t) { - System.err.println("ReplayMod caught error during ModCore init:"); - t.printStackTrace(); - } - } -} -*/ diff --git a/versions/1.16.4-forge/src/main/java/com/replaymod/core/utils/ModInfoGetter.java b/versions/1.16.4-forge/src/main/java/com/replaymod/core/utils/ModInfoGetter.java deleted file mode 100644 index 1883a24f..00000000 --- a/versions/1.16.4-forge/src/main/java/com/replaymod/core/utils/ModInfoGetter.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.replaymod.core.utils; - -import com.replaymod.replaystudio.data.ModInfo; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.registries.ForgeRegistry; -import net.minecraftforge.registries.GameData; - -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -class ModInfoGetter { - static Collection getInstalledNetworkMods() { - return ModList.get().getMods().stream() - .map(mod -> new ModInfo(mod.getModId(), mod.getModId(), mod.getVersion().toString())) - .collect(Collectors.toList()); - } -} diff --git a/versions/1.16.4-forge/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java b/versions/1.16.4-forge/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java deleted file mode 100644 index 55a22bf1..00000000 --- a/versions/1.16.4-forge/src/main/java/com/replaymod/core/versions/forge/EventsAdapter.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.replaymod.core.versions.forge; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.replaymod.core.events.*; -import com.replaymod.gui.utils.EventRegistrations; -import com.replaymod.replay.events.RenderHotbarCallback; -import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; -import net.minecraftforge.client.event.InputEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.RenderHandEvent; -import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -public class EventsAdapter extends EventRegistrations { - @SubscribeEvent - public void onKeyEvent(InputEvent.KeyInputEvent event) { - KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); - } - - @SubscribeEvent - public void onMouseInput(InputEvent.MouseInputEvent event) { - KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); - } - - @SubscribeEvent - public void preRender(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.START) return; - PreRenderCallback.EVENT.invoker().preRender(); - } - - @SubscribeEvent - public void postRender(TickEvent.RenderTickEvent event) { - if (event.phase != TickEvent.Phase.END) return; - PostRenderCallback.EVENT.invoker().postRender(); - } - - @SubscribeEvent - public void renderCameraPath(RenderWorldLastEvent event) { - PostRenderWorldCallback.EVENT.invoker().postRenderWorld(new MatrixStack()); - } - - @SubscribeEvent - public void oRenderHand(RenderHandEvent event) { - if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) { - event.setCanceled(true); - } - } - - @SubscribeEvent - public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) { - Boolean result = null; - switch (event.getType()) { - case CROSSHAIRS: - result = RenderSpectatorCrosshairCallback.EVENT.invoker().shouldRenderSpectatorCrosshair(); - break; - case HOTBAR: - result = RenderHotbarCallback.EVENT.invoker().shouldRenderHotbar(); - break; - } - if (result == Boolean.FALSE) { - event.setCanceled(true); - } - } -} diff --git a/versions/1.16.4-forge/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java b/versions/1.16.4-forge/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java deleted file mode 100644 index be08964f..00000000 --- a/versions/1.16.4-forge/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.replaymod.gui.versions.forge; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.replaymod.gui.utils.EventRegistrations; -import com.replaymod.gui.versions.callbacks.*; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.Widget; -import net.minecraftforge.client.event.GuiOpenEvent; -import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -import java.util.List; - -public class EventsAdapter extends EventRegistrations { - public static Screen getScreen(GuiScreenEvent event) { - //#if MC>=10904 - return event.getGui(); - //#else - //$$ return event.gui; - //#endif - } - - public static List getButtonList(GuiScreenEvent.InitGuiEvent event) { - //#if MC>=10904 - return event.getWidgetList(); - //#else - //$$ return event.buttonList; - //#endif - } - - @SubscribeEvent - public void preGuiInit(GuiScreenEvent.InitGuiEvent.Pre event) { - InitScreenCallback.Pre.EVENT.invoker().preInitScreen(getScreen(event)); - } - - @SubscribeEvent - public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) { - InitScreenCallback.EVENT.invoker().initScreen(getScreen(event), getButtonList(event)); - } - - @SubscribeEvent(priority = EventPriority.LOWEST) - public void onGuiClosed(GuiOpenEvent event) { - OpenGuiScreenCallback.EVENT.invoker().openGuiScreen( - //#if MC>=10904 - event.getGui() - //#else - //$$ event.gui - //#endif - ); - } - - public static float getPartialTicks(RenderGameOverlayEvent event) { - //#if MC>=10904 - return event.getPartialTicks(); - //#else - //$$ return event.partialTicks; - //#endif - } - - public static float getPartialTicks(GuiScreenEvent.DrawScreenEvent.Post event) { - //#if MC>=10904 - return event.getRenderPartialTicks(); - //#else - //$$ return event.renderPartialTicks; - //#endif - } - - @SubscribeEvent - public void onGuiRender(GuiScreenEvent.DrawScreenEvent.Post event) { - PostRenderScreenCallback.EVENT.invoker().postRenderScreen(new MatrixStack(), getPartialTicks(event)); - } - - // Even when event was cancelled cause Lunatrius' InGame-Info-XML mod cancels it and we don't actually care about - // the event (i.e. the overlay text), just about when it's called. - @SubscribeEvent(receiveCanceled = true) - public void renderOverlay(RenderGameOverlayEvent.Text event) { - RenderHudCallback.EVENT.invoker().renderHud(new MatrixStack(), getPartialTicks(event)); - } - - @SubscribeEvent - public void tickOverlay(TickEvent.ClientTickEvent event) { - if (event.phase == TickEvent.Phase.START) { - PreTickCallback.EVENT.invoker().preTick(); - } - } -} diff --git a/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java b/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java deleted file mode 100644 index 1bf9487d..00000000 --- a/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.replaymod.mixin; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.network.play.ClientPlayNetHandler; -import net.minecraft.client.util.SearchTreeManager; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.play.server.STagsListPacket; -import net.minecraft.tags.ITagCollectionSupplier; -import org.spongepowered.asm.mixin.Final; -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(ClientPlayNetHandler.class) -public abstract class MixinClientPlayNetHandler { - @Shadow @Final - private NetworkManager netManager; - - @Shadow - private Minecraft client; - - @Shadow - private ITagCollectionSupplier networkTagManager; - - @Inject(method = "handleTags", at=@At(value = "HEAD"), cancellable = true) - public void replayMod_ignoreHandshakeConnectionClose(STagsListPacket packetIn, CallbackInfo ci) { - System.out.println("Injected ClientPlayNetHandler.handleTags"); - // PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); - ITagCollectionSupplier itagcollectionsupplier = packetIn.getTags(); - // boolean vanillaConnection = net.minecraftforge.fml.network.NetworkHooks.isVanillaConnection(netManager); - boolean vanillaConnection = false; - net.minecraftforge.common.ForgeTagHandler.resetCachedTagCollections(true, vanillaConnection); - itagcollectionsupplier = ITagCollectionSupplier.reinjectOptionalTags(itagcollectionsupplier); - this.networkTagManager = itagcollectionsupplier; - if (!this.netManager.isLocalChannel()) { - itagcollectionsupplier.updateTags(); - } - - this.client.getSearchTree(SearchTreeManager.TAGS).recalculate(); - - ci.cancel(); - } -} diff --git a/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java b/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java deleted file mode 100644 index 29815314..00000000 --- a/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.replaymod.mixin; - -import io.netty.channel.ChannelPipeline; -import net.minecraft.network.NetworkManager; -import net.minecraft.util.text.ITextComponent; -import net.minecraftforge.fml.network.FMLHandshakeHandler; -import net.minecraftforge.fml.network.NetworkDirection; -import net.minecraftforge.fml.network.NetworkRegistry; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.MixinEnvironment; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.List; - -@Mixin(FMLHandshakeHandler.class) -public abstract class MixinFMLHandshakeHandler { - @Shadow - private List messageList; - - @Shadow @Final - private NetworkDirection direction; - - @Inject(method = "(Lnet/minecraft/network/NetworkManager;Lnet/minecraftforge/fml/network/NetworkDirection;)V", at = @At("TAIL")) - public void replayModRecording_setupForLocalRecording(NetworkManager networkManager, NetworkDirection side, CallbackInfo ci) { - if (!networkManager.isLocalChannel()) { - return; - } - - System.out.println("Force FML handshaking and set LoginPayloads"); - this.messageList = NetworkRegistryAccessor.invokeGatherLoginPayloads(this.direction, false); - } - - @Redirect(method = "handleRegistryLoading", at=@At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;closeChannel(Lnet/minecraft/util/text/ITextComponent;)V")) - public void replayMod_ignoreHandshakeConnectionClose(NetworkManager networkManager, ITextComponent message) {} -} diff --git a/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java b/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java deleted file mode 100644 index 4e1a5274..00000000 --- a/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.replaymod.mixin; - -import com.replaymod.core.versions.MCVer; -import com.replaymod.recording.ReplayModRecording; -import com.replaymod.recording.handler.RecordingEventHandler; -import net.minecraft.client.network.login.ClientLoginNetHandler; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.login.server.SCustomPayloadLoginPacket; -import org.spongepowered.asm.mixin.Final; -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(ClientLoginNetHandler.class) -public abstract class MixinNetHandlerLoginClient { - - @Final @Shadow - private NetworkManager networkManager; - - @Inject(method = "handleLoginSuccess", at=@At("HEAD")) - public void replayModRecording_initiateRecording(CallbackInfo cb) { - initiateRecording(null); - } - - /** - * Starts the recording right before switching into PLAY state. - * We cannot use the {@link FMLNetworkEvent.ClientConnectedToServerEvent} - * as it only fires after the forge handshake. - */ - @Inject(method = "handleCustomPayloadLogin", at=@At("HEAD")) - public void replayModRecording_initiateRecording(SCustomPayloadLoginPacket packetIn, CallbackInfo cb) { - initiateRecording(packetIn); - } - - private void initiateRecording(SCustomPayloadLoginPacket packet) { - RecordingEventHandler.RecordingEventSender eventSender = (RecordingEventHandler.RecordingEventSender) MCVer.getMinecraft().worldRenderer; - if (eventSender.getRecordingEventHandler() != null) { - return; // already recording - } - ReplayModRecording.instance.initiateRecording(this.networkManager); - if (eventSender.getRecordingEventHandler() != null && packet != null) { - eventSender.getRecordingEventHandler().onPacket(packet); - } - } -} diff --git a/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/NetworkRegistryAccessor.java b/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/NetworkRegistryAccessor.java deleted file mode 100644 index d1475f9b..00000000 --- a/versions/1.16.4-forge/src/main/java/com/replaymod/mixin/NetworkRegistryAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.replaymod.mixin; - -import net.minecraftforge.fml.network.NetworkDirection; -import net.minecraftforge.fml.network.NetworkRegistry; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.List; - -@Mixin(NetworkRegistry.class) -public interface NetworkRegistryAccessor { - @Invoker("gatherLoginPayloads") - static List invokeGatherLoginPayloads(NetworkDirection direction, boolean isLocal) { - throw new AssertionError(); - } -} diff --git a/versions/1.16.4/.gitkeep b/versions/1.16.4/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.7.10/.gitkeep b/versions/1.7.10/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.7.10/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java b/versions/1.7.10/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java deleted file mode 100644 index cec9d0a5..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/compat/shaders/mixin/MixinShaders.java +++ /dev/null @@ -1,52 +0,0 @@ -//#if MC<=10710 -package com.replaymod.compat.shaders.mixin; - -import com.replaymod.render.hooks.EntityRendererHandler; -import com.replaymod.replay.ReplayHandler; -import com.replaymod.replay.ReplayModReplay; -import net.minecraft.client.Minecraft; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Pseudo -@Mixin(targets = "shadersmod/client/Shaders", remap = false) -public abstract class MixinShaders { - - @Shadow static Minecraft mc; - @Shadow static long systemTime; - @Shadow static long lastSystemTime; - @Shadow static long diffSystemTime; - @Shadow static int frameCounter; - @Shadow static float frameTime; - @Shadow static float frameTimeCounter; - - @Redirect(method = "beginRender", at = @At(value = "INVOKE", target = "Ljava/lang/System;currentTimeMillis()J")) - private static long replayModCompat_currentTimeMillis() { - ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); - if (replayHandler != null) { - systemTime = replayHandler.getReplaySender().currentTimeStamp(); - - // We need to manipulate all the other previous-frame-time-based variables too - - lastSystemTime = 0; // Draw all frames as if they were the first ones - // diffSystemTime will be set to 0 by Shaders - // frameTime will be set to 0 by Shaders - frameTimeCounter = systemTime / 1000f; // will be %= 3600f by Shaders - - // Set frameCounter only if rendering is in progress - EntityRendererHandler entityRendererHandler = - ((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler(); - if (entityRendererHandler != null) { - frameCounter = entityRendererHandler.getRenderInfo().getFramesDone(); - } - - return systemTime; - } - return System.currentTimeMillis(); - } - -} -//#endif diff --git a/versions/1.7.10/src/main/java/com/replaymod/core/asm/GLErrorTransformer.java b/versions/1.7.10/src/main/java/com/replaymod/core/asm/GLErrorTransformer.java deleted file mode 100644 index 06098167..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/core/asm/GLErrorTransformer.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.replaymod.core.asm; - -import net.minecraft.launchwrapper.IClassTransformer; -import org.lwjgl.opengl.GL11; -import org.lwjgl.util.glu.GLU; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -/** - * Insert glGetError checks after all calls to any method in any GL*, ARB* and EXT* classes - */ -public class GLErrorTransformer implements IClassTransformer { - private static final String GL_CLASS = "org.lwjgl.opengl.GL"; - private static final String GL = GL_CLASS.replace('.', '/'); - private static final String ARB_CLASS = "org.lwjgl.opengl.ARB"; - private static final String ARB = ARB_CLASS.replace('.', '/'); - private static final String EXT_CLASS = "org.lwjgl.opengl.EXT"; - private static final String EXT = EXT_CLASS.replace('.', '/'); - private static final String GLErrorTransformer_CLASS = GLErrorTransformer.class.getName(); - private static final String GLErrorTransformer = GLErrorTransformer_CLASS.replace('.', '/'); - - @Override - public byte[] transform(String name, String transformedName, byte[] basicClass) { - if (basicClass == null) return null; - - ClassReader reader = new ClassReader(basicClass); - ClassWriter writer = new ClassWriter(reader, 0); - reader.accept(new ClassVisitor(Opcodes.ASM5, writer) { - @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); - return new MethodVisitor(Opcodes.ASM5, mv) { - @Override - public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - super.visitMethodInsn(opcode, owner, name, desc, itf); - if (owner.startsWith(GL) || owner.startsWith(ARB) || owner.startsWith(EXT)) { - visitLdcInsn(owner.replace('/', '.')); - visitLdcInsn(name); - super.visitMethodInsn(Opcodes.INVOKESTATIC, GLErrorTransformer, "glErrorCheck", "(Ljava/lang/String;Ljava/lang/String;)V", false); - } - } - - @Override - public void visitMaxs(int maxStack, int maxLocals) { - super.visitMaxs(maxStack + 2, maxLocals); - } - }; - } - }, 0); - return writer.toByteArray(); - } - - private static boolean inGlBegin; - - @SuppressWarnings("unused") // Called via ASM - public static void glErrorCheck(String cls, String method) { - if (method.equals("glBegin") && cls.equals(GL_CLASS + "11")) { - if (inGlBegin) { - // glBegin within glBegin - throw new GLError(GL11.GL_INVALID_OPERATION, cls, method); - } - inGlBegin = true; - return; - } - if (inGlBegin && method.equals("glEnd") && cls.equals(GL_CLASS + "11")) { - inGlBegin = false; - } - if (inGlBegin) { - return; // Cannot call glGetError in between of glBegin and glEnd - } - int err = GL11.glGetError(); - if (err != 0) { - GLError e = new GLError(err, cls, method); - if ("true".equals(System.getProperty("replaymod.glerrors.throw", "true"))) { - throw e; - } else { - e.printStackTrace(); - } - } - } - - public static class GLError extends RuntimeException { - private GLError(int err, String cls, String method) { - super(GLU.gluErrorString(err) + " (" + err + ")"); - StackTraceElement[] stack = getStackTrace(); - stack[0] = new StackTraceElement(cls, method, stack[0].getFileName(), stack[0].getLineNumber()); - setStackTrace(stack); - } - } -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/core/asm/GLStateTrackerTransformer.java b/versions/1.7.10/src/main/java/com/replaymod/core/asm/GLStateTrackerTransformer.java deleted file mode 100644 index 641cf104..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/core/asm/GLStateTrackerTransformer.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.replaymod.core.asm; - -import net.minecraft.launchwrapper.IClassTransformer; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -import java.util.HashSet; -import java.util.Set; - -/** - * Redirect all calls to GL11.glEnable and GL11.glDisable to the GLStateTracker (excluding that class itself). - */ -public class GLStateTrackerTransformer implements IClassTransformer { - private static final String GL11_CLASS = "org.lwjgl.opengl.GL11"; - private static final String GL11 = GL11_CLASS.replace('.', '/'); - private static final String glEnable = "glEnable"; - private static final String glDisable = "glDisable"; - private static final String GLStateTracker_CLASS = "com.replaymod.render.hooks.GLStateTracker"; - private static final String GLStateTracker = GLStateTracker_CLASS.replace('.', '/'); - private static final String hook_glEnable = "hook_glEnable"; - private static final String hook_glDisable = "hook_glDisable"; - - @Override - public byte[] transform(String name, String transformedName, byte[] basicClass) { - if (basicClass == null) return null; - // Ignore the state tracker itself - if (name.equals(GLStateTracker_CLASS)) return basicClass; - - ClassReader reader = new ClassReader(basicClass); - Set eligibleMethods = findEligibleMethods(reader); - if (eligibleMethods.isEmpty()) { - return basicClass; - } - - ClassWriter writer = new ClassWriter(reader, 0); - reader.accept(new ClassVisitor(Opcodes.ASM5, writer) { - @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); - if (!eligibleMethods.contains(new Method(name, desc))) { - return mv; - } - return new MethodVisitor(Opcodes.ASM5, mv) { - @Override - public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - if (owner.equals(GL11)) { - if (name.equals(glEnable)) { - owner = GLStateTracker; - name = hook_glEnable; - } else if (name.equals(glDisable)) { - owner = GLStateTracker; - name = hook_glDisable; - } - } - super.visitMethodInsn(opcode, owner, name, desc, itf); - } - }; - } - }, 0); - return writer.toByteArray(); - } - - private Set findEligibleMethods(ClassReader reader) { - Set eligibleMethods = new HashSet<>(); - reader.accept(new ClassVisitor(Opcodes.ASM5) { - @Override - public MethodVisitor visitMethod(int access, String methodName, String methodDesc, String signature, String[] exceptions) { - return new MethodVisitor(Opcodes.ASM5) { - @Override - public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - if (owner.equals(GL11) && (name.equals(glEnable) || name.equals(glDisable))) { - eligibleMethods.add(new Method(methodName, methodDesc)); - } - } - }; - } - }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); - return eligibleMethods; - } - - private static class Method { - private final String name, desc; - - private Method(String name, String desc) { - this.name = name; - this.desc = desc; - } - - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - Method method = (Method) o; - return name.equals(method.name) && desc.equals(method.desc); - } - - @Override - public int hashCode() { - return name.hashCode() ^ desc.hashCode(); - } - } -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/core/mixin/ResourcePackRepositoryAccessor.java b/versions/1.7.10/src/main/java/com/replaymod/core/mixin/ResourcePackRepositoryAccessor.java deleted file mode 100644 index d9c16a24..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/core/mixin/ResourcePackRepositoryAccessor.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.replaymod.core.mixin; - -import net.minecraft.client.resources.IResourcePack; -import net.minecraft.client.resources.ResourcePackRepository; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.io.File; - -@Mixin(ResourcePackRepository.class) -public interface ResourcePackRepositoryAccessor { - @Accessor("field_148533_g") - boolean isActive(); - @Accessor("field_148533_g") - void setActive(boolean value); - @Accessor("field_148532_f") - void setPack(IResourcePack value); - @Accessor("field_148534_e") - File getCacheDir(); -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/core/utils/ModInfoGetter.java b/versions/1.7.10/src/main/java/com/replaymod/core/utils/ModInfoGetter.java deleted file mode 100644 index c8b8e842..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/core/utils/ModInfoGetter.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.replaymod.core.utils; - -import com.replaymod.replaystudio.data.ModInfo; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.ModContainer; -import cpw.mods.fml.common.registry.GameData; - -import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -class ModInfoGetter { - static Collection getInstalledNetworkMods() { - Map ignoreCaseMap = Loader.instance().getModList().stream() - .collect(Collectors.toMap(m -> m.getModId().toLowerCase(), Function.identity())); - return Stream.concat( - ((Set) GameData.getBlockRegistry().getKeys()).stream(), - ((Set) GameData.getItemRegistry().getKeys()).stream() - ).map(name -> { - if (!name.contains(":")) return null; // Still using old names without namespace, can't do anything, ignore - return name.split(":", 2)[0]; - }).filter(Objects::nonNull) - .filter(s -> !s.equals("minecraft")).distinct() - .map(String::toLowerCase).map(ignoreCaseMap::get).filter(Objects::nonNull) - .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion())) - .collect(Collectors.toList()); - } -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/core/versions/BufferBuilder.java b/versions/1.7.10/src/main/java/com/replaymod/core/versions/BufferBuilder.java deleted file mode 100644 index 73628626..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/core/versions/BufferBuilder.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.replaymod.core.versions; - -import net.minecraft.client.renderer.Tessellator; - -public class BufferBuilder { - - private final Tessellator inner; - - public BufferBuilder(Tessellator inner) { - this.inner = inner; - } - - public void startDrawing(int glQuads) { - inner.startDrawing(glQuads); - } - - public void addVertexWithUV(double x, double y, double z, float u, float v) { - inner.addVertexWithUV(x, y, z, u, v); - } - - public void setColorRGBA(int r, int g, int b, int a) { - inner.setColorRGBA(r, g, b, a); - } - - public void addVertex(double x, double y, double z) { - inner.addVertex(x, y, z); - } - - public static class VertexFormats {} -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java b/versions/1.7.10/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java deleted file mode 100644 index 1f795d7c..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/recording/mixin/MixinGuiScreen.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.replaymod.recording.mixin; - -import de.johni0702.minecraft.gui.container.VanillaGuiScreen; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.common.MinecraftForge; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(GuiScreen.class) -public abstract class MixinGuiScreen { - - @Inject(method = "handleInput", at = @At("HEAD"), cancellable = true) - private void handleJGuiInput(CallbackInfo ci) { - ci.cancel(); - if (Mouse.isCreated()) { - while (Mouse.next()) { - if (MinecraftForge.EVENT_BUS.post(new VanillaGuiScreen.MouseInputEvent())) { - continue; - } - handleMouseInput(); - } - } - - if (Keyboard.isCreated()) { - while (Keyboard.next()) { - if (MinecraftForge.EVENT_BUS.post(new VanillaGuiScreen.KeyboardInputEvent())) { - continue; - } - handleKeyboardInput(); - } - } - } - - @Shadow public abstract void handleMouseInput(); - - @Shadow public abstract void handleKeyboardInput(); -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/recording/mixin/MixinS26PacketMapChunkBulk.java b/versions/1.7.10/src/main/java/com/replaymod/recording/mixin/MixinS26PacketMapChunkBulk.java deleted file mode 100644 index b7c64009..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/recording/mixin/MixinS26PacketMapChunkBulk.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.replaymod.recording.mixin; - -import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.server.S21PacketChunkData; -import net.minecraft.network.play.server.S26PacketMapChunkBulk; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.concurrent.Semaphore; - -@Mixin({ S21PacketChunkData.class, S26PacketMapChunkBulk.class }) -public abstract class MixinS26PacketMapChunkBulk { - - private byte[] rawData; - - @Shadow(remap = false) - private Semaphore deflateGate; - - @Inject(method = "readPacketData", at = @At("HEAD")) - private void replayModRecording_readRawPacketData(PacketBuffer data, CallbackInfo ci) { - int readerIndex = data.readerIndex(); - data.readBytes(rawData = new byte[data.readableBytes()]); - data.readerIndex(readerIndex); - } - - @Inject(method = "writePacketData", at = @At("HEAD"), cancellable = true) - private void replayModRecording_writePacketData(PacketBuffer data, CallbackInfo ci) { - if (rawData != null && deflateGate == null) { - data.writeBytes(rawData); - ci.cancel(); - } - } -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java b/versions/1.7.10/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java deleted file mode 100644 index eb4134eb..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/render/hooks/ForceChunkLoadingHook.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.replaymod.render.hooks; - -import net.minecraft.client.renderer.RenderGlobal; - -public class ForceChunkLoadingHook { - private final RenderGlobal hooked; - - public ForceChunkLoadingHook(RenderGlobal renderGlobal) { - this.hooked = renderGlobal; - - IForceChunkLoading.from(renderGlobal).replayModRender_setHook(this); - } - - public void uninstall() { - IForceChunkLoading.from(hooked).replayModRender_setHook(null); - } -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/render/hooks/GLStateTracker.java b/versions/1.7.10/src/main/java/com/replaymod/render/hooks/GLStateTracker.java deleted file mode 100644 index 54c06ce4..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/render/hooks/GLStateTracker.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.replaymod.render.hooks; - -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL13; - -/** - * Tracks OpenGL state for use in the ODS shader. - * All methods should be called from the GL mixins only. - */ -public class GLStateTracker { - private static ThreadLocal stateTracker = ThreadLocal.withInitial(GLStateTracker::new); - public static GLStateTracker getInstance() { - return stateTracker.get(); - } - - public int activeTexture; - - public void updateActiveTexture(int magic) { - this.activeTexture = magic - GL13.GL_TEXTURE0; - } - - public void updateEnabledState(int magic, boolean enabled) { - switch (magic) { - case GL11.GL_FOG: FogStateCallback.EVENT.invoker().fogStateChanged(enabled); break; - case GL11.GL_TEXTURE_2D: Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(activeTexture, enabled); break; - } - } - - // Called via ASM (see GLStateTrackerTransformer) - @Deprecated - @SuppressWarnings("unused") - public static void hook_glEnable(int magic) { - GL11.glEnable(magic); - getInstance().updateEnabledState(magic, true); - } - - // Called via ASM (see GLStateTrackerTransformer) - @Deprecated - @SuppressWarnings("unused") - public static void hook_glDisable(int magic) { - GL11.glDisable(magic); - getInstance().updateEnabledState(magic, false); - } -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java b/versions/1.7.10/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java deleted file mode 100644 index 8a20ca74..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/render/mixin/MixinOpenGlHelper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.replaymod.render.mixin; - -import com.replaymod.render.hooks.GLStateTracker; -import net.minecraft.client.renderer.OpenGlHelper; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(OpenGlHelper.class) -public abstract class MixinOpenGlHelper { - @Inject(method = "setActiveTexture", at = @At("RETURN")) - private static void replayModRender_trackActiveTexture(int magic, CallbackInfo ci) { - GLStateTracker.getInstance().updateActiveTexture(magic); - } -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java b/versions/1.7.10/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java deleted file mode 100644 index 3d319182..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.replaymod.render.mixin; - -import com.replaymod.render.hooks.ForceChunkLoadingHook; -import com.replaymod.render.hooks.IForceChunkLoading; -import net.minecraft.client.renderer.RenderGlobal; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -@Mixin(RenderGlobal.class) -public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { - private ForceChunkLoadingHook replayModRender_hook; - - @Override - public void replayModRender_setHook(ForceChunkLoadingHook hook) { - this.replayModRender_hook = hook; - } - - @ModifyVariable(method = "updateRenderers", at = @At("HEAD"), argsOnly = true) - private boolean replayModRender_updateAllChunks(boolean renderAllChunks) { - if (replayModRender_hook != null) { - renderAllChunks = true; - } - return renderAllChunks; - } -} - diff --git a/versions/1.7.10/src/main/java/com/replaymod/replay/mixin/MixinEntityRenderer.java b/versions/1.7.10/src/main/java/com/replaymod/replay/mixin/MixinEntityRenderer.java deleted file mode 100644 index 40c44332..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/replay/mixin/MixinEntityRenderer.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.replaymod.replay.mixin; - -import com.replaymod.replay.camera.CameraEntity; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.EntityRenderer; -import net.minecraft.entity.EntityLivingBase; -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(EntityRenderer.class) -public class MixinEntityRenderer { - @Shadow private float prevCamRoll; - @Shadow private float camRoll; - @Shadow private Minecraft mc; - - @Inject(method = "orientCamera", at = @At("HEAD")) - private void applyRoll(float partialTicks, CallbackInfo ci) { - EntityLivingBase view = mc.renderViewEntity; - if (view instanceof CameraEntity) { - prevCamRoll = camRoll = ((CameraEntity) view).roll; - } - } -} diff --git a/versions/1.7.10/src/main/java/com/replaymod/replay/mixin/MixinFMLClientHandler.java b/versions/1.7.10/src/main/java/com/replaymod/replay/mixin/MixinFMLClientHandler.java deleted file mode 100644 index b5e45632..00000000 --- a/versions/1.7.10/src/main/java/com/replaymod/replay/mixin/MixinFMLClientHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.replaymod.replay.mixin; - -import com.replaymod.replay.gui.screen.GuiOpeningReplay; -import cpw.mods.fml.client.FMLClientHandler; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = FMLClientHandler.class, remap = false) -public class MixinFMLClientHandler { - // Usually this method is called async and can just block and wait for MC to tick the network manager - // Since we sometimes call it sync though, we need to take care of ticking ourselves. - @Inject(method = "waitForPlayClient", at = @At("HEAD"), remap = false) - private void tickNetworkManager(CallbackInfo ci) { - Minecraft mc = Minecraft.getMinecraft(); - if (!mc.isCallingFromMinecraftThread()) { - return; - } - GuiScreen gui = mc.currentScreen; - if (gui instanceof GuiOpeningReplay) { - gui.handleInput(); - } - } -} diff --git a/versions/1.8.9/.gitkeep b/versions/1.8.9/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.8.9/mapping.txt b/versions/1.8.9/mapping.txt deleted file mode 100644 index 43123ad0..00000000 --- a/versions/1.8.9/mapping.txt +++ /dev/null @@ -1,20 +0,0 @@ -net.minecraft.entity.player.EntityPlayer isWearing() func_175148_a() -net.minecraft.client.renderer.WorldRenderer begin() startDrawing() -net.minecraft.network.play.server.S38PacketPlayerListItem getAction() func_179768_b() -net.minecraft.network.play.server.S40PacketDisconnect getReason() func_149165_c() -net.minecraft.network.play.server.S48PacketResourcePackSend getURL() func_179783_a() -net.minecraft.network.play.server.S48PacketResourcePackSend getHash() func_179784_b() -net.minecraft.network.play.server.S08PacketPlayerPosLook getX() func_148932_c() -net.minecraft.network.play.server.S08PacketPlayerPosLook getY() func_148928_d() -net.minecraft.network.play.server.S08PacketPlayerPosLook getZ() func_148933_e() -net.minecraft.network.play.server.S2BPacketChangeGameState getGameState() func_149138_c() -net.minecraft.network.play.server.S0EPacketSpawnObject getType() func_148993_l() -net.minecraft.network.play.server.S21PacketChunkData getChunkX() func_149273_e() -net.minecraft.network.play.server.S21PacketChunkData getChunkZ() func_149271_f() -net.minecraft.network.play.server.S21PacketChunkData getExtractedSize() func_149276_g() -net.minecraft.network.play.server.S0CPacketSpawnPlayer watcher field_148960_i -net.minecraft.network.play.server.S0CPacketSpawnPlayer getPlayer() func_179819_c() -net.minecraft.network.play.server.S0DPacketCollectItem getEntityID() func_149354_c() -net.minecraft.util.Timer counter field_74285_i -net.minecraft.client.resources.ResourcePackRepository setResourcePackInstance() func_177319_a() -net.minecraft.client.resources.ResourcePackRepository downloadResourcePack() func_180601_a() diff --git a/versions/1.8.9/src/main/java/com/replaymod/recording/mixin/MixinPlayerControllerMP.java b/versions/1.8.9/src/main/java/com/replaymod/recording/mixin/MixinPlayerControllerMP.java deleted file mode 100644 index 1adc3fa2..00000000 --- a/versions/1.8.9/src/main/java/com/replaymod/recording/mixin/MixinPlayerControllerMP.java +++ /dev/null @@ -1 +0,0 @@ -// 1.9.4 - 1.12.2 diff --git a/versions/1.8.9/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java b/versions/1.8.9/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java deleted file mode 100644 index a7dd45eb..00000000 --- a/versions/1.8.9/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.replaymod.render.mixin; - -import com.replaymod.render.blend.BlendState; -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.entity.Entity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -//#if MC>=10800 -import com.replaymod.render.blend.exporters.ParticlesExporter; -import net.minecraft.client.renderer.WorldRenderer; -//#else -//$$ import net.minecraft.client.renderer.Tessellator; -//#endif - -@Mixin(EffectRenderer.class) -public abstract class MixinEffectRenderer { - //#if MC>=10800 - //#if MC>=10809 - @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) - //#else - //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) - //#endif - private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, - float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - } - //#else - //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/Tessellator;FFFFFF)V")) - //$$ private void renderNormalParticle(EntityFX fx, Tessellator tesselator, float partialTicks, - //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - //$$ renderParticle(fx, tesselator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - //$$ } - //#endif - - //#if MC>=10800 - //#if MC>=10809 - @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) - //#else - //$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) - //#endif - private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, - float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - } - //#else - //$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;renderParticle(Lnet/minecraft/client/renderer/Tessellator;FFFFFF)V")) - //$$ private void renderLitParticle(EntityFX fx, Tessellator tessellator, float partialTicks, - //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - //$$ renderParticle(fx, tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - //$$ } - //#endif - - private void renderParticle(EntityFX fx, - //#if MC>=10800 - WorldRenderer worldRenderer, Entity view, - //#else - //$$ Tessellator tessellator, - //#endif - float partialTicks, - float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); - if (handler != null && handler.omnidirectional) { - //#if MC<=10710 - //$$ Entity view = Minecraft.getMinecraft().renderViewEntity; - //#endif - // Align all particles towards the camera - double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX; - double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY; - 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)); - } - //#if MC>=10800 - BlendState blendState = BlendState.getState(); - if (blendState != null) { - blendState.get(ParticlesExporter.class).onRender(fx, partialTicks); - } - //#endif - //#if MC>=10809 - fx.renderParticle(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - //#else - //#if MC>=10800 - //$$ fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - //#else - //$$ fx.renderParticle(tessellator, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - //#endif - //#endif - } -} diff --git a/versions/1.8.9/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags_LivingEntity.java b/versions/1.8.9/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags_LivingEntity.java deleted file mode 100644 index edbd70ef..00000000 --- a/versions/1.8.9/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags_LivingEntity.java +++ /dev/null @@ -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 Mixin_HideNameTags_LivingEntity { - @Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true) - private void replayModRender_areAllNamesHidden(EntityLivingBase entity, CallbackInfoReturnable ci) { - EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); - if (handler != null && !handler.getSettings().isRenderNameTags()) { - ci.setReturnValue(false); //this calls the cancel method - } - } -} diff --git a/versions/1.8/.gitkeep b/versions/1.8/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.8/mapping.txt b/versions/1.8/mapping.txt deleted file mode 100644 index 3096beb7..00000000 --- a/versions/1.8/mapping.txt +++ /dev/null @@ -1,40 +0,0 @@ -net.minecraftforge.fml.common.Mod cpw.mods.fml.common.Mod -net.minecraftforge.fml.common.Loader cpw.mods.fml.common.Loader -net.minecraftforge.fml.common.Mod.EventHandler cpw.mods.fml.common.Mod.EventHandler -net.minecraftforge.fml.common.Mod.Instance cpw.mods.fml.common.Mod.Instance -net.minecraftforge.fml.common.ModContainer cpw.mods.fml.common.ModContainer -net.minecraftforge.fml.common.event.FMLInitializationEvent cpw.mods.fml.common.event.FMLInitializationEvent -net.minecraftforge.fml.common.event.FMLPreInitializationEvent cpw.mods.fml.common.event.FMLPreInitializationEvent -net.minecraftforge.fml.common.eventhandler.SubscribeEvent cpw.mods.fml.common.eventhandler.SubscribeEvent -net.minecraftforge.fml.common.eventhandler.EventPriority cpw.mods.fml.common.eventhandler.EventPriority -net.minecraftforge.fml.common.eventhandler.Cancelable cpw.mods.fml.common.eventhandler.Cancelable -net.minecraftforge.fml.common.eventhandler.Event cpw.mods.fml.common.eventhandler.Event -net.minecraftforge.fml.client.registry.ClientRegistry cpw.mods.fml.client.registry.ClientRegistry -net.minecraftforge.fml.common.registry.GameData cpw.mods.fml.common.registry.GameData -net.minecraftforge.fml.common.gameevent.InputEvent cpw.mods.fml.common.gameevent.InputEvent -net.minecraftforge.fml.common.gameevent.TickEvent cpw.mods.fml.common.gameevent.TickEvent -net.minecraftforge.fml.relauncher.CoreModManager cpw.mods.fml.relauncher.CoreModManager -net.minecraftforge.fml.relauncher.IFMLLoadingPlugin cpw.mods.fml.relauncher.IFMLLoadingPlugin -net.minecraftforge.fml.common.FMLCommonHandler cpw.mods.fml.common.FMLCommonHandler -net.minecraftforge.fml.client.FMLClientHandler cpw.mods.fml.client.FMLClientHandler -net.minecraftforge.fml.common.eventhandler.EventBus cpw.mods.fml.common.eventhandler.EventBus -net.minecraft.client.renderer.GlStateManager com.replaymod.core.versions.MCVer.GlStateManager -net.minecraft.client.renderer.GlStateManager.BooleanState com.replaymod.render.hooks.GLStateTracker.BooleanState -net.minecraftforge.fml.common.network.FMLNetworkEvent cpw.mods.fml.common.network.FMLNetworkEvent -net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec cpw.mods.fml.common.network.handshake.FMLHandshakeCodec -net.minecraftforge.fml.common.network.handshake.NetworkDispatcher cpw.mods.fml.common.network.handshake.NetworkDispatcher -net.minecraftforge.fml.relauncher.Side cpw.mods.fml.relauncher.Side -net.minecraftforge.fml.common.gameevent.PlayerEvent cpw.mods.fml.common.gameevent.PlayerEvent -net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent -net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage cpw.mods.fml.common.network.handshake.FMLHandshakeMessage -net.minecraftforge.fml.common.network.handshake.FMLHandshakeMessage.RegistryData cpw.mods.fml.common.network.handshake.FMLHandshakeMessage.ModIdData -net.minecraftforge.fml.common.network.internal.FMLProxyPacket cpw.mods.fml.common.network.internal.FMLProxyPacket -net.minecraftforge.fml.common.network.NetworkRegistry cpw.mods.fml.common.network.NetworkRegistry -net.minecraftforge.fml.common.gameevent.InputEvent cpw.mods.fml.common.gameevent.InputEvent -net.minecraftforge.fml.common.versioning.ComparableVersion cpw.mods.fml.common.versioning.ComparableVersion -net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer net.minecraft.client.renderer.tileentity.RenderEndPortal -net.minecraft.network.play.server.S3FPacketCustomPayload getChannelName() func_149169_c() -net.minecraft.network.play.server.S01PacketJoinGame getEntityId() func_149197_c() -net.minecraft.client.network.NetHandlerLoginClient networkManager field_147393_d -net.minecraft.client.renderer.WorldRenderer com.replaymod.core.versions.BufferBuilder -net.minecraft.client.renderer.vertex.DefaultVertexFormats com.replaymod.core.versions.BufferBuilder.VertexFormats diff --git a/versions/1.9.4/.gitkeep b/versions/1.9.4/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/1.9.4/mapping.txt b/versions/1.9.4/mapping.txt deleted file mode 100644 index 9225b4c1..00000000 --- a/versions/1.9.4/mapping.txt +++ /dev/null @@ -1,66 +0,0 @@ -net.minecraft.stats.StatisticsManager net.minecraft.stats.StatFileWriter -net.minecraft.init.MobEffects net.minecraft.potion.Potion -net.minecraft.util.text.TextComponentString net.minecraft.util.ChatComponentText -net.minecraft.util.text.TextComponentTranslation net.minecraft.util.ChatComponentTranslation -net.minecraft.util.text.Style net.minecraft.util.ChatStyle -net.minecraft.util.text.TextFormatting net.minecraft.util.EnumChatFormatting -net.minecraft.util.text.ITextComponent net.minecraft.util.IChatComponent -net.minecraft.network.datasync.EntityDataManager net.minecraft.entity.DataWatcher -net.minecraft.network.datasync.EntityDataManager.DataEntry net.minecraft.entity.DataWatcher.WatchableObject -net.minecraft.client.renderer.VertexBuffer net.minecraft.client.renderer.WorldRenderer -net.minecraft.client.particle.Particle net.minecraft.client.particle.EntityFX -net.minecraft.util.math.MathHelper net.minecraft.util.MathHelper -net.minecraft.util.SoundCategory net.minecraft.client.audio.SoundCategory -net.minecraft.util.math.BlockPos net.minecraft.util.BlockPos -net.minecraft.client.gui.GuiWorldSelection net.minecraft.client.gui.GuiSelectWorld -net.minecraft.util.math.AxisAlignedBB net.minecraft.util.AxisAlignedBB -net.minecraft.util.math.RayTraceResult net.minecraft.util.MovingObjectPosition -net.minecraft.client.renderer.RenderItem net.minecraft.client.renderer.entity.RenderItem -net.minecraft.network.play.server.SPacketSpawnMob dataManager field_149043_l -net.minecraft.network.play.server.SPacketSpawnMob getDataManagerEntries() func_149027_c() -net.minecraft.network.play.server.SPacketSpawnPlayer getDataManagerEntries() func_148944_c() -net.minecraft.client.multiplayer.ServerList saveSingleServer() func_147414_b() -net.minecraft.util.SoundEvent com.replaymod.core.versions.MCVer.SoundEvent - -net.minecraft.network.play.server.SPacketJoinGame net.minecraft.network.play.server.S01PacketJoinGame -net.minecraft.network.play.server.SPacketChat net.minecraft.network.play.server.S02PacketChat -net.minecraft.network.play.server.SPacketParticles net.minecraft.network.play.server.S2APacketParticles -net.minecraft.network.play.server.SPacketChangeGameState net.minecraft.network.play.server.S2BPacketChangeGameState -net.minecraft.network.play.server.SPacketPlayerPosLook net.minecraft.network.play.server.S08PacketPlayerPosLook -net.minecraft.network.play.server.SPacketPlayerListItem net.minecraft.network.play.server.S38PacketPlayerListItem -net.minecraft.network.play.server.SPacketRespawn net.minecraft.network.play.server.S07PacketRespawn -net.minecraft.network.play.server.SPacketSpawnPlayer net.minecraft.network.play.server.S0CPacketSpawnPlayer -net.minecraft.network.play.server.SPacketSpawnObject net.minecraft.network.play.server.S0EPacketSpawnObject -net.minecraft.network.play.server.SPacketSpawnMob net.minecraft.network.play.server.S0FPacketSpawnMob -net.minecraft.network.play.server.SPacketSpawnGlobalEntity net.minecraft.network.play.server.S2CPacketSpawnGlobalEntity -net.minecraft.network.play.server.SPacketSpawnPainting net.minecraft.network.play.server.S10PacketSpawnPainting -net.minecraft.network.play.server.SPacketSpawnExperienceOrb net.minecraft.network.play.server.S11PacketSpawnExperienceOrb -net.minecraft.network.play.server.SPacketDestroyEntities net.minecraft.network.play.server.S13PacketDestroyEntities -net.minecraft.network.play.server.SPacketEntity net.minecraft.network.play.server.S14PacketEntity -net.minecraft.network.play.server.SPacketEntityTeleport net.minecraft.network.play.server.S18PacketEntityTeleport -net.minecraft.network.play.server.SPacketEntityHeadLook net.minecraft.network.play.server.S19PacketEntityHeadLook -net.minecraft.network.play.server.SPacketEntityVelocity net.minecraft.network.play.server.S12PacketEntityVelocity -net.minecraft.network.play.server.SPacketEntityAttach net.minecraft.network.play.server.S1BPacketEntityAttach -net.minecraft.network.play.server.SPacketAnimation net.minecraft.network.play.server.S0BPacketAnimation -net.minecraft.network.play.server.SPacketCollectItem net.minecraft.network.play.server.S0DPacketCollectItem -net.minecraft.network.play.server.SPacketBlockBreakAnim net.minecraft.network.play.server.S25PacketBlockBreakAnim -net.minecraft.network.play.client.CPacketResourcePackStatus net.minecraft.network.play.client.C19PacketResourcePackStatus -net.minecraft.network.play.client.CPacketResourcePackStatus.Action net.minecraft.network.play.client.C19PacketResourcePackStatus.Action -net.minecraft.network.play.server.SPacketResourcePackSend net.minecraft.network.play.server.S48PacketResourcePackSend -net.minecraft.network.play.server.SPacketCustomPayload net.minecraft.network.play.server.S3FPacketCustomPayload -net.minecraft.network.play.server.SPacketDisconnect net.minecraft.network.play.server.S40PacketDisconnect -net.minecraft.network.play.server.SPacketUpdateHealth net.minecraft.network.play.server.S06PacketUpdateHealth -net.minecraft.network.play.server.SPacketSetSlot net.minecraft.network.play.server.S2FPacketSetSlot -net.minecraft.network.play.server.SPacketSignEditorOpen net.minecraft.network.play.server.S36PacketSignEditorOpen -net.minecraft.network.play.server.SPacketSetExperience net.minecraft.network.play.server.S1FPacketSetExperience -net.minecraft.network.play.server.SPacketCamera net.minecraft.network.play.server.S43PacketCamera -net.minecraft.network.play.server.SPacketTitle net.minecraft.network.play.server.S45PacketTitle -net.minecraft.network.play.server.SPacketOpenWindow net.minecraft.network.play.server.S2DPacketOpenWindow -net.minecraft.network.play.server.SPacketCloseWindow net.minecraft.network.play.server.S2EPacketCloseWindow -net.minecraft.network.play.server.SPacketWindowItems net.minecraft.network.play.server.S30PacketWindowItems -net.minecraft.network.play.server.SPacketStatistics net.minecraft.network.play.server.S37PacketStatistics -net.minecraft.network.play.server.SPacketPlayerAbilities net.minecraft.network.play.server.S39PacketPlayerAbilities -net.minecraft.network.play.server.SPacketEntityEquipment net.minecraft.network.play.server.S04PacketEntityEquipment -net.minecraft.network.play.server.SPacketUseBed net.minecraft.network.play.server.S0APacketUseBed -net.minecraft.network.login.server.SPacketEnableCompression net.minecraft.network.login.server.S03PacketEnableCompression -net.minecraft.network.login.server.SPacketLoginSuccess net.minecraft.network.login.server.S02PacketLoginSuccess diff --git a/versions/core/.gitkeep b/versions/core/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/versions/mainProject b/versions/mainProject deleted file mode 100644 index 709c55fe..00000000 --- a/versions/mainProject +++ /dev/null @@ -1 +0,0 @@ -1.16.4 \ No newline at end of file diff --git a/versions/mapping-1.16.4-fabric-forge.txt b/versions/mapping-1.16.4-fabric-forge.txt deleted file mode 100644 index f6ad2b58..00000000 --- a/versions/mapping-1.16.4-fabric-forge.txt +++ /dev/null @@ -1,6 +0,0 @@ -net.minecraft.util.Identifier net.minecraft.util.ResourceLocation - -net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket getChannel() getChannelName() -net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket getData() getBufferData() - -net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket net.minecraft.network.play.server.SCustomPayloadPlayPacket diff --git a/versions/mapping-fabric-1.15.2-1.14.4.txt b/versions/mapping-fabric-1.15.2-1.14.4.txt deleted file mode 100644 index 96c87321..00000000 --- a/versions/mapping-fabric-1.15.2-1.14.4.txt +++ /dev/null @@ -1,15 +0,0 @@ -net.minecraft.client.util.math.MatrixStack de.johni0702.minecraft.gui.versions.MatrixStack -net.minecraft.client.render.entity.EntityRenderer shouldRender() isVisible() -net.minecraft.client.render.GameRenderer renderWorld() renderCenter() -net.minecraft.entity.LivingEntity serverX field_6224 -net.minecraft.entity.LivingEntity serverY field_6245 -net.minecraft.entity.LivingEntity serverZ field_6263 -net.minecraft.entity.LivingEntity serverYaw field_6284 -net.minecraft.entity.LivingEntity serverPitch field_6221 -net.minecraft.client.render.WorldRenderer drawBlockOutline() drawHighlightedBlockOutline() -net.minecraft.client.render.GameRenderer method_22973() applyCameraTransformations() -net.minecraft.client.util.math.Matrix4f viewboxMatrix() method_4929() -net.minecraft.client.util.ScreenshotUtils takeScreenshot() method_1663() -net.minecraft.client.util.ScreenshotUtils saveScreenshot() method_1659() -net.minecraft.client.render.WorldRenderer setupTerrain() setUpTerrain() -net.minecraft.client.gui.hud.SpectatorHud cycleSlot() method_1976() From 11eee82429b10c01cc2cb72661a3d1d445348a54 Mon Sep 17 00:00:00 2001 From: Yuji Ueki Date: Sat, 30 Jan 2021 22:27:04 +0900 Subject: [PATCH 4/5] :shower: Remove jGui --- jGui/.gitignore | Bin 2519 -> 0 bytes jGui/HEADER.txt | 22 - jGui/LICENSE | 19 - jGui/build.gradle | 149 ---- jGui/gradle.properties | 5 - jGui/gradle/wrapper/gradle-wrapper-old.jar | Bin 52271 -> 0 bytes .../wrapper/gradle-wrapper-old.properties | 6 - jGui/gradle/wrapper/gradle-wrapper.jar | Bin 54413 -> 0 bytes jGui/gradle/wrapper/gradle-wrapper.properties | 6 - jGui/gradlew | 172 ----- jGui/gradlew.bat | 84 -- jGui/preprocess.gradle.kts | 28 - jGui/root.gradle.kts | 41 - jGui/settings.gradle.kts | 42 - .../johni0702/minecraft/gui/GuiRenderer.java | 84 -- .../minecraft/gui/MinecraftGuiRenderer.java | 290 ------- .../minecraft/gui/OffsetGuiRenderer.java | 220 ------ .../johni0702/minecraft/gui/RenderInfo.java | 103 --- .../AbstractGuiClickableContainer.java | 86 --- .../gui/container/AbstractGuiContainer.java | 254 ------ .../gui/container/AbstractGuiOverlay.java | 401 ---------- .../gui/container/AbstractGuiScreen.java | 412 ---------- .../gui/container/AbstractGuiScrollable.java | 172 ----- .../container/AbstractGuiVerticalList.java | 217 ------ .../minecraft/gui/container/GuiClickable.java | 40 - .../minecraft/gui/container/GuiContainer.java | 61 -- .../minecraft/gui/container/GuiOverlay.java | 40 - .../minecraft/gui/container/GuiPanel.java | 140 ---- .../minecraft/gui/container/GuiScreen.java | 49 -- .../gui/container/GuiScrollable.java | 39 - .../gui/container/GuiVerticalList.java | 39 - .../gui/container/VanillaGuiScreen.java | 282 ------- .../element/AbstractComposedGuiElement.java | 79 -- .../gui/element/AbstractGuiButton.java | 243 ------ .../gui/element/AbstractGuiCheckbox.java | 119 --- .../gui/element/AbstractGuiClickable.java | 85 -- .../gui/element/AbstractGuiElement.java | 219 ------ .../AbstractGuiHorizontalScrollbar.java | 209 ----- .../gui/element/AbstractGuiImage.java | 185 ----- .../gui/element/AbstractGuiLabel.java | 122 --- .../gui/element/AbstractGuiNumberField.java | 221 ------ .../gui/element/AbstractGuiPasswordField.java | 48 -- .../gui/element/AbstractGuiSlider.java | 190 ----- .../gui/element/AbstractGuiTextField.java | 623 --------------- .../element/AbstractGuiTexturedButton.java | 268 ------- .../gui/element/AbstractGuiToggleButton.java | 84 -- .../gui/element/AbstractGuiTooltip.java | 119 --- .../gui/element/ComposedGuiElement.java | 93 --- .../minecraft/gui/element/GuiButton.java | 41 - .../minecraft/gui/element/GuiCheckbox.java | 41 - .../minecraft/gui/element/GuiElement.java | 63 -- .../gui/element/GuiHorizontalScrollbar.java | 41 - .../minecraft/gui/element/GuiImage.java | 45 -- .../minecraft/gui/element/GuiLabel.java | 41 - .../minecraft/gui/element/GuiNumberField.java | 41 - .../gui/element/GuiPasswordField.java | 41 - .../minecraft/gui/element/GuiSlider.java | 41 - .../minecraft/gui/element/GuiTextField.java | 41 - .../gui/element/GuiTexturedButton.java | 41 - .../gui/element/GuiToggleButton.java | 41 - .../minecraft/gui/element/GuiTooltip.java | 32 - .../minecraft/gui/element/IGuiButton.java | 82 -- .../minecraft/gui/element/IGuiCheckbox.java | 37 - .../minecraft/gui/element/IGuiClickable.java | 30 - .../gui/element/IGuiHorizontalScrollbar.java | 62 -- .../minecraft/gui/element/IGuiImage.java | 42 - .../minecraft/gui/element/IGuiLabel.java | 43 -- .../gui/element/IGuiNumberField.java | 53 -- .../minecraft/gui/element/IGuiSlider.java | 38 - .../minecraft/gui/element/IGuiTextField.java | 169 ---- .../gui/element/IGuiTexturedButton.java | 59 -- .../gui/element/IGuiToggleButton.java | 37 - .../advanced/AbstractGuiColorPicker.java | 255 ------ .../advanced/AbstractGuiDropdownMenu.java | 297 ------- .../advanced/AbstractGuiProgressBar.java | 99 --- .../AbstractGuiResourceLoadingList.java | 281 ------- .../element/advanced/AbstractGuiTextArea.java | 726 ------------------ .../element/advanced/AbstractGuiTimeline.java | 350 --------- .../advanced/AbstractGuiTimelineTime.java | 99 --- .../gui/element/advanced/GuiColorPicker.java | 42 - .../gui/element/advanced/GuiDropdownMenu.java | 42 - .../gui/element/advanced/GuiProgressBar.java | 41 - .../advanced/GuiResourceLoadingList.java | 43 -- .../gui/element/advanced/GuiTextArea.java | 41 - .../gui/element/advanced/GuiTimeline.java | 41 - .../gui/element/advanced/GuiTimelineTime.java | 41 - .../gui/element/advanced/IGuiColorPicker.java | 41 - .../element/advanced/IGuiDropdownMenu.java | 70 -- .../gui/element/advanced/IGuiProgressBar.java | 39 - .../gui/element/advanced/IGuiTextArea.java | 77 -- .../gui/element/advanced/IGuiTimeline.java | 132 ---- .../element/advanced/IGuiTimelineTime.java | 49 -- .../minecraft/gui/function/Clickable.java | 31 - .../minecraft/gui/function/Closeable.java | 29 - .../minecraft/gui/function/Draggable.java | 32 - .../minecraft/gui/function/Focusable.java | 42 - .../minecraft/gui/function/Loadable.java | 29 - .../minecraft/gui/function/Scrollable.java | 38 - .../minecraft/gui/function/Tickable.java | 29 - .../minecraft/gui/function/Typeable.java | 31 - .../minecraft/gui/layout/CustomLayout.java | 133 ---- .../minecraft/gui/layout/GridLayout.java | 276 ------- .../gui/layout/HorizontalLayout.java | 158 ---- .../minecraft/gui/layout/Layout.java | 41 - .../minecraft/gui/layout/LayoutData.java | 29 - .../minecraft/gui/layout/VerticalLayout.java | 174 ----- .../minecraft/gui/layout/VoidLayoutData.java | 32 - .../minecraft/gui/popup/AbstractGuiPopup.java | 174 ----- .../gui/popup/GuiFileChooserPopup.java | 351 --------- .../minecraft/gui/popup/GuiInfoPopup.java | 126 --- .../minecraft/gui/popup/GuiYesNoPopup.java | 167 ---- .../johni0702/minecraft/gui/utils/Colors.java | 38 - .../minecraft/gui/utils/Consumer.java | 29 - .../minecraft/gui/utils/Consumers.java | 36 - .../johni0702/minecraft/gui/utils/Event.java | 38 - .../gui/utils/EventRegistration.java | 40 - .../gui/utils/EventRegistrations.java | 54 -- .../minecraft/gui/utils/MouseUtils.java | 69 -- .../minecraft/gui/utils/NonNull.java | 8 - .../minecraft/gui/utils/StringUtils.java | 60 -- .../johni0702/minecraft/gui/utils/Utils.java | 97 --- .../minecraft/gui/versions/Image.java | 114 --- .../minecraft/gui/versions/MCVer.java | 218 ------ .../minecraft/gui/versions/MatrixStack.java | 1 - .../callbacks/InitScreenCallback.java | 31 - .../versions/callbacks/KeyboardCallback.java | 45 -- .../gui/versions/callbacks/MouseCallback.java | 56 -- .../callbacks/OpenGuiScreenCallback.java | 16 - .../callbacks/PostRenderScreenCallback.java | 16 - .../versions/callbacks/PreTickCallback.java | 15 - .../versions/callbacks/RenderHudCallback.java | 16 - .../gui/versions/forge/EventsAdapter.java | 1 - .../gui/versions/mixin/MixinGameRenderer.java | 31 - .../versions/mixin/MixinKeyboardListener.java | 72 -- .../gui/versions/mixin/MixinMinecraft.java | 26 - .../versions/mixin/MixinMouseListener.java | 55 -- .../gui/versions/mixin/MixinScreen.java | 32 - .../mixin/Mixin_RenderHudCallback.java | 33 - jGui/src/main/resources/assets/jgui/gui.png | Bin 4230 -> 0 bytes jGui/src/main/resources/mixins.jgui.json | 22 - jGui/versions/1.12/mapping.txt | 1 - .../minecraft/gui/versions/Image.java | 85 -- .../gui/versions/forge/EventsAdapter.java | 93 --- jGui/versions/1.14.4-forge/mapping.txt | 30 - .../minecraft/gui/versions/MatrixStack.java | 4 - jGui/versions/1.8/mapping.txt | 4 - jGui/versions/1.9.4/mapping.txt | 1 - jGui/versions/mainProject | 1 - jGui/versions/mapping-1.16.4-fabric-forge.txt | 4 - .../versions/mapping-fabric-1.15.2-1.14.4.txt | 1 - 150 files changed, 13833 deletions(-) delete mode 100644 jGui/.gitignore delete mode 100644 jGui/HEADER.txt delete mode 100644 jGui/LICENSE delete mode 100644 jGui/build.gradle delete mode 100644 jGui/gradle.properties delete mode 100644 jGui/gradle/wrapper/gradle-wrapper-old.jar delete mode 100644 jGui/gradle/wrapper/gradle-wrapper-old.properties delete mode 100644 jGui/gradle/wrapper/gradle-wrapper.jar delete mode 100644 jGui/gradle/wrapper/gradle-wrapper.properties delete mode 100755 jGui/gradlew delete mode 100644 jGui/gradlew.bat delete mode 100644 jGui/preprocess.gradle.kts delete mode 100644 jGui/root.gradle.kts delete mode 100644 jGui/settings.gradle.kts delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/GuiRenderer.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/MinecraftGuiRenderer.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/OffsetGuiRenderer.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/RenderInfo.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiClickableContainer.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiOverlay.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScreen.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScrollable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiVerticalList.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiClickable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiContainer.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiOverlay.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiPanel.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiScreen.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiScrollable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiVerticalList.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/container/VanillaGuiScreen.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractComposedGuiElement.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiButton.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiCheckbox.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiClickable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiElement.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiHorizontalScrollbar.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiImage.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiLabel.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiNumberField.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiPasswordField.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiSlider.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTextField.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTexturedButton.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiToggleButton.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTooltip.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/ComposedGuiElement.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiButton.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiCheckbox.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiElement.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiHorizontalScrollbar.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiImage.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiLabel.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiNumberField.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiPasswordField.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiSlider.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTextField.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTexturedButton.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiToggleButton.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTooltip.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiButton.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiCheckbox.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiClickable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiHorizontalScrollbar.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiImage.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiLabel.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiNumberField.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiSlider.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiTextField.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiTexturedButton.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiToggleButton.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiColorPicker.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiDropdownMenu.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiProgressBar.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiResourceLoadingList.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTextArea.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTimeline.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTimelineTime.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiColorPicker.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiDropdownMenu.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiProgressBar.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiResourceLoadingList.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTextArea.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTimeline.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTimelineTime.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiColorPicker.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiDropdownMenu.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiProgressBar.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTextArea.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTimeline.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTimelineTime.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/function/Clickable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/function/Closeable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/function/Draggable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/function/Focusable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/function/Loadable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/function/Scrollable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/function/Tickable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/function/Typeable.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/layout/CustomLayout.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/layout/GridLayout.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/layout/HorizontalLayout.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/layout/Layout.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/layout/LayoutData.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/layout/VerticalLayout.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/layout/VoidLayoutData.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/popup/AbstractGuiPopup.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiFileChooserPopup.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiInfoPopup.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiYesNoPopup.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/Colors.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/Consumer.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/Consumers.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/Event.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/EventRegistration.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/EventRegistrations.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/MouseUtils.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/NonNull.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/StringUtils.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/utils/Utils.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/Image.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/MCVer.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/MatrixStack.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/InitScreenCallback.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/KeyboardCallback.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/MouseCallback.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/OpenGuiScreenCallback.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/PostRenderScreenCallback.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/PreTickCallback.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/RenderHudCallback.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/forge/EventsAdapter.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinGameRenderer.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinKeyboardListener.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinMinecraft.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinMouseListener.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinScreen.java delete mode 100644 jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/Mixin_RenderHudCallback.java delete mode 100644 jGui/src/main/resources/assets/jgui/gui.png delete mode 100644 jGui/src/main/resources/mixins.jgui.json delete mode 100644 jGui/versions/1.12/mapping.txt delete mode 100644 jGui/versions/1.12/src/main/java/de/johni0702/minecraft/gui/versions/Image.java delete mode 100644 jGui/versions/1.12/src/main/java/de/johni0702/minecraft/gui/versions/forge/EventsAdapter.java delete mode 100644 jGui/versions/1.14.4-forge/mapping.txt delete mode 100644 jGui/versions/1.14.4/src/main/java/de/johni0702/minecraft/gui/versions/MatrixStack.java delete mode 100644 jGui/versions/1.8/mapping.txt delete mode 100644 jGui/versions/1.9.4/mapping.txt delete mode 100644 jGui/versions/mainProject delete mode 100644 jGui/versions/mapping-1.16.4-fabric-forge.txt delete mode 100644 jGui/versions/mapping-fabric-1.15.2-1.14.4.txt diff --git a/jGui/.gitignore b/jGui/.gitignore deleted file mode 100644 index a0380b46146f428aa0f590797aae6ea9857caf03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2519 zcmZ`*!E)O+5X~81v5k7LJr5K*>ArTP>umC7oJ>=W_79=IP zGrdsM0t@WEefyRpntCOpDkxp*1R+NBh%H9Zi*qK>%K2{R+5K;ix91|O5uO{Q@#FU8zcK^5A{+(u=LzQ3gBHs3#@+L!cHH49*0U($8cOkK&Q{j`$47GR1-B~d(@4J8`q zGJwU6cRx@wre7`NmB@6dst{N`JOlVv2MWQcvjX&u!xZU@w^ z7|5?d`Eh7ep;x+~5Zl%23g+(oo%5T}$U-HC4b~{bCcLqfy5QLHmVr6KwK4Ta-6#{Cg%E^1j=B1MI2{$1wJTBakoMlspRb2i8Ck}(wCpqP zly87z$~|iKQ5WH$iL7tew)EUyi`bUhp~K4qlg|a@XqhCdb6l!d*3@N)9+c`(I9bj> zTy$h)Vw{-Asqs%28IKX&7DhMWL?|w@W?!mpPk*SbijwIe4ho{}L?r#aU>OFux!m9x zc6k4pS)B{x3TaO78iWLBWh|+Uj1|*%xP6Lh3wGd^OAD`2c?->sm;sbxN4twm^>!W& zH!NkarV2dpmC%`hPDl5?A5J#1wb0N`+FCEUYr=bk+b!^2)7i^`5F#s1qPRaAu7c!NP_#D_2y>i8&pQ{%tw_?=nYPBIGgsi(#%HzFfngqh`}pC5 z$W{SZ*%(TZEigL`kF$R11;gK=`}cDUD%_lA7*ED;=}ZnU(}hhEHwZL{O*jT8>QwQf z|Lj1HtjST)_1zN%==%Ycn*kmbHqkZWvqJuUL+LuYOT$(iVxc}5*`&b=EYK%^Xp8TG zHzQ~;>6*Vl()26vg@N!Bm?0~3p{mHhrgz4)o9i7LlZ$|2a!i@Fno)mN#lFBCy#dTE z&mp9hj!p>$@$2*L^v~(TZFV#NoQOX}F}EQC4~S;cG%&o7Ii7XU=~<^|!*>iWp@NPS UZ46j4cGD$#=fFfEdV)^=1!$>H5&!@I diff --git a/jGui/HEADER.txt b/jGui/HEADER.txt deleted file mode 100644 index b0f9338a..00000000 --- a/jGui/HEADER.txt +++ /dev/null @@ -1,22 +0,0 @@ -This file is part of ${name}, licensed under the MIT License (MIT). - -Copyright (c) ${year} ${author} <${url}> -Copyright (c) contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/jGui/LICENSE b/jGui/LICENSE deleted file mode 100644 index 749aa1ec..00000000 --- a/jGui/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -The MIT License (MIT) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/jGui/build.gradle b/jGui/build.gradle deleted file mode 100644 index 5760ec38..00000000 --- a/jGui/build.gradle +++ /dev/null @@ -1,149 +0,0 @@ -buildscript { - def mcVersion - def (major, minor, patch) = project.name.tokenize('-')[0].tokenize('.') - mcVersion = "${major}${minor.padLeft(2, '0')}${(patch ?: '').padLeft(2, '0')}" as int - def fabric = mcVersion >= 11400 && !project.name.endsWith("-forge") - project.ext.mcVersion = mcVersion - project.ext.fabric = fabric - - repositories { - mavenLocal() - mavenCentral() - maven { - name = "fabric" - url = "https://maven.fabricmc.net/" - } - if (!fabric) { - maven { - name = "forge" - url = "https://files.minecraftforge.net/maven" - } - maven { url "https://maven.tterrag.com/" } - } - maven { - name = "sonatype" - url = "https://oss.sonatype.org/content/repositories/snapshots/" - } - maven { url 'https://jitpack.io' } - } - - dependencies { - if (fabric) { - classpath 'fabric-loom:fabric-loom.gradle.plugin:0.6-SNAPSHOT' - } else if (mcVersion >= 11400) { - classpath('net.minecraftforge.gradle:ForgeGradle:4.1.+'){ - exclude group: 'trove', module: 'trove' // preprocessor/idea requires more recent one - } - } else if (mcVersion >= 10800) { - classpath('com.github.ReplayMod:ForgeGradle:' + ( - mcVersion >= 11200 ? 'b64de9c' : // FG 2.3 - mcVersion >= 10904 ? '5bb7a53' : // FG 2.2 - 'fc1eabc' // FG 2.1 - ) + ':all') - } else { - classpath 'com.github.ReplayMod:ForgeGradle:5fca6853:all' // FG 1.2 - } - } -} - -def FG4 = !fabric && mcVersion >= 11400 -def FABRIC = fabric - -if (FABRIC) { - apply plugin: 'fabric-loom' -} else if (FG4) { - apply plugin: 'net.minecraftforge.gradle' -} else if (mcVersion >= 10800) { - apply plugin: 'net.minecraftforge.gradle.forge' -} else { - apply plugin: 'forge' -} -apply plugin: 'com.replaymod.preprocess' - -preprocess { - vars.put("MC", project.mcVersion) - vars.put("FABRIC", project.fabric ? 1 : 0) -} - -group 'de.johni0702.minecraft.jgui' -version 'git' - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -if (mcVersion >= 11400) { - sourceSets { - api - } -} - -repositories { - mavenLocal() - mavenCentral() - maven { - name = "fabric" - url = "https://maven.fabricmc.net/" - } - maven { url 'https://jitpack.io' } -} - -dependencies { - compile('com.github.ReplayMod:lwjgl-utils:27dcd66') -} - -if (FABRIC) { - minecraft { - refmapName = 'mixins.jgui.refmap.json' - } -} else { - minecraft { - if (FG4) { - mappings channel: 'snapshot', version: '20210309-1.16.4' - } else { - version = [ - 11200: '1.12.2-14.23.0.2486', - 10904: '1.9.4-12.17.0.1976', - 10809: '1.8.9-11.15.1.1722', - 10800: '1.8-11.14.4.1563', - 10710: '1.7.10-10.13.4.1558-1.7.10', - ][mcVersion] - - mappings = [ - 11604: "snapshot_20210309-1.16.4", - 11200: 'snapshot_20170615', - 10904: 'snapshot_20160518', - 10809: 'stable_22', - 10800: 'snapshot_nodoc_20141130', - 10710: 'stable_12', - ][mcVersion] - } - } -} - -dependencies { - if (FABRIC) { - minecraft 'com.mojang:minecraft:' + [ - 11404: '1.14.4', - 11502: '1.15.2', - 11601: '1.16.1', - 11604: '1.16.4', - ][mcVersion] - mappings 'net.fabricmc:yarn:' + [ - 11404: '1.14.4+build.16', - 11502: '1.15.2+build.14', - 11601: '1.16.1+build.17:v2', - 11604: '1.16.4+build.6:v2', - ][mcVersion] - modCompile 'net.fabricmc:fabric-loader:' + [ - 11404: '0.4.8+build.155', - 11502: '0.7.8+build.189', - 11601: '0.8.8+build.202', - 11604: '0.10.6+build.214', - ][mcVersion] - } - if (FG4) { - minecraft 'net.minecraftforge:forge:' + [ - 11604: '1.16.4-35.1.37', - ][mcVersion] - } -} diff --git a/jGui/gradle.properties b/jGui/gradle.properties deleted file mode 100644 index b209ec29..00000000 --- a/jGui/gradle.properties +++ /dev/null @@ -1,5 +0,0 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. -# This is required to provide enough memory for the Minecraft decompilation process. -org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false -org.gradle.parallel= diff --git a/jGui/gradle/wrapper/gradle-wrapper-old.jar b/jGui/gradle/wrapper/gradle-wrapper-old.jar deleted file mode 100644 index 30d399d8d2bf522ff5de94bf434a7cc43a9a74b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52271 zcmafaW0a=B^559DjdyI@wy|T|wr$(CJv+9!W822gY&N+!|K#4>Bz;ajPk*RBjZ;RV75EK*;p4^!@(BB5~-#>pF^k0$_Qx&35mhPenc zNjoahrs}{XFFPtR8Xs)MInR7>x_1Kpw+a8w@n0(g``fp7GXFmo^}qAL{*%Yt$3(FfIbReeZ6|xbrftHf0>dl5l+$$VLbG+m|;Uk##see6$CK4I^ ziDe}0)5eiLr!R5hk6u9aKT36^C>3`nJ0l07RQ1h438axccsJk z{kKyd*$G`m`zrtre~(!7|FcIGPiGfXTSX`PzlY^wY3ls9=iw>j>SAGP=VEDW=wk2m zk3%R`v9(7LLh{1^gpVy8R2tN#ZmfE#9!J?P7~nw1MnW^mRmsT;*cyVG*SVY6CqC3a zMccC8L%tQqGz+E@0i)gy&0g_7PV@3~zaE~h-2zQ|SdqjALBoQBT2pPYH^#-Hv8!mV z-r%F^bXb!hjQwm2^oEuNkVelqJLf029>h5N1XzEvYb=HA`@uO_*rgQZG`tKgMrKh~aq~ z6oX{k?;tz&tW3rPe+`Q8F5(m5dJHyv`VX0of2nf;*UaVsiMR!)TjB`jnN2)6z~3CK@xZ_0x>|31=5G$w!HcYiYRDdK3mtO1GgiFavDsn&1zs zF|lz}sx*wA(IJoVYnkC+jmhbirgPO_Y1{luB>!3Jr2eOB{X?e2Vh8>z7F^h$>GKmb z?mzET;(r({HD^;NNqbvUS$lhHSBHOWI#xwT0Y?b!TRic{ z>a%hUpta3P2TbRe_O;s5@KjZ#Dijg4f=MWJ9euZnmd$UCUNS4I#WDUT2{yhVWt#Ee z?upJB_de&7>FHYm0Y4DU!Kxso=?RabJ*qsZ2r4K8J#pQ)NF?zFqW#XG1fX6dFC}qh z3%NlVXc@Re3vkXi*-&m)~SYS?OA8J?ygD3?N}Pq zrt_G*8B7^(uS7$OrAFL5LvQdQE2o40(6v`se%21Njk4FoLV-L0BN%%w40%k6Z1ydO zb@T(MiW@?G-j^j5Ypl@!r`Vw&lkJtR3B#%N~=C z@>#A{z8xFL=2)?mzv;5#+HAFR7$3BMS-F=U<&^217zGkGFFvNktqX z3z79GH^!htJe$D-`^(+kG*);7qocnfnPr^ieTpx&P;Z$+{aC8@h<0DDPkVx`_J~J> zdvwQxbiM1B{J6_V?~PNusoB5B88S%q#$F@Fxs4&l==UW@>9w2iU?9qMOgQWCl@7C* zsbi$wiEQEnaum!v49B_|^IjgM-TqMW!vBhhvP?oB!Ll4o-j?u3JLLFHM4ZVfl9Y_L zAjz@_3X5r=uaf|nFreX#gCtWU44~pA!yjZNXiZkoHhE$l@=ZTuxcLh53KdMOfanVe zPEX(#8GM7#%2*2}5rrdBk8p#FmzpIC>%1I9!2nRakS|^I*QHbG_^4<=p)(YOKvsTp zE#DzUI>Y&g)4mMaU6Bhrm8rSC{F_4J9sJlF0S5y5_=^l!{?W_n&SPj&7!dEvLzNIRMZBYyYU@Qftts7Zr7r>W- zqqk46|LEF|&6bn#CE~yMbiF&vEoLUA(}WzwmXH_=<~|I(9~{AE$ireF7~XBqPV2)* zcqjOCdi&>tUEuq31s(|TFqx>Wuo(ooWO(sd!W~Hu@AXg=iQgq^O3Lv9xH$vx*vrgDAirQqs9_DLS1e45HcUPdEMziO?Mm1v!)n93L%REy=7 zUxcX!jo!vyl_l0)O(Y~OT``;8mB(tcf}`Rh^weqPnDVDe-ngsZ~C z`onh0WLdaShAAb-3b{hT5ej9a$POQ9;RlPy}IYzKyv+8-HzB7fV!6X@a_T61qZ zWqb&&ip*@{;D-1vR3F2Q&}%Q>TFH&2n?2w8u8g=Y{!|;>P%<@AlshvM;?r7I)yXG% z^IpXZ(~)V*j^~sOG#cWCa+b8LC1IgqFx+Mq$I`6VYGE#AUajA9^$u-{0X#4h49a77 zH>d>h3P@u!{7h2>1j+*KYSNrKE-Q(z`C;n9N>mfdrlWo$!dB35;G4eTWA}(aUj&mNyi-N+lcYGpA zt1<~&u`$tIurZ2-%Tzb1>mb(~B8;f^0?FoPVdJ`NCAOE~hjEPS) z&r7EY4JrG~azq$9$V*bhKxeC;tbBnMds48pDuRy=pHoP*GfkO(UI;rT;Lg9ZH;JU~ zO6gTCRuyEbZ97jQyV7hM!Nfwr=jKjYsR;u8o(`(;qJ(MVo(yA<3kJximtAJjOqT=3 z8Bv-^`)t{h)WUo&t3alsZRJXGPOk&eYf}k2JO!7Au8>cvdJ3wkFE3*WP!m_glB-Rt z!uB>HV9WGcR#2n(rm=s}ulY7tXn5hC#UrNob)-1gzn-KH8T?GEs+JBEU!~9Vg*f6x z_^m1N20Do}>UIURE4srAMM6fAdzygdCLwHe$>CsoWE;S2x@C=1PRwT438P@Vt(Nk` zF~yz7O0RCS!%hMmUSsKwK$)ZtC#wO|L4GjyC?|vzagOP#7;W3*;;k?pc!CA=_U8>% z%G^&5MtFhvKq}RcAl))WF8I#w$So?>+_VEdDm_2=l^K320w~Bn2}p+4zEOt#OjZ6b zxEYoTYzvs$%+ZYwj;mZ@fF42F1-Hb<&72{1J)(D~VyVpo4!dq259t-_Oo3Yg7*R`N zUg!js4NRyfMbS*NLEF}rGrlXz0lHz))&&+B#Tdo@wlh-Q8wr7~9)$;s9+yJH0|m=F zSD9mUW>@HLt}mhAApYrhdviKhW`BfNU3bPSz=hD+!q`t*IhG+Z4XK;_e#AkF5 z&(W7iUWF4PNQ+N!-b-^3B$J4KeA1}&ta@HK=o2khx!I&g#2Y&SWo-;|KXDw!Xb)mP z$`WzPA!F(h*E=QP4;hu7@8J&T|ZPQ2H({7Vau6&g;mer3q?1K!!^`|0ld26 zq|J&h7L-!zn!GnYhjp`c7rG>kd1Y%8yJE9M0-KtN=)8mXh45d&i*bEmm%(4~f&}q@ z1uq)^@SQ~L?aVCAU7ZYFEbZ<730{&m?Un?Q!pxI7DwA^*?HloDysHW{L!JY!oQ8WMK(vT z@fFakL6Ijo$S$GH;cfXcoNvwVc8R7bQnOX2N1s$2fbX@qzTv>748In?JUSk@41;-8 zBw`fUVf$Jxguy{m1t_Z&Q6N$Ww*L9e%6V*r3Yp8&jVpxyM+W?l0km=pwm21ch9}+q z$Z&eb9BARV1?HVgjAzhy);(y1l6)+YZ3+u%f@Y3stu5sSYjQl;3DsM719wz98y4uClWqeD>l(n@ce)pal~-24U~{wq!1Z_ z2`t+)Hjy@nlMYnUu@C`_kopLb7Qqp+6~P=36$O!d2oW=46CGG54Md`6LV3lnTwrBs z!PN}$Kd}EQs!G22mdAfFHuhft!}y;8%)h&@l7@DF0|oy?FR|*E&Zuf=e{8c&hTNu# z6{V#^p+GD@A_CBDV5sM%OA*NwX@k1t?2|)HIBeKk(9!eX#J>jN;)XQ%xq^qVe$I}& z{{cL^a}>@*ZD$Ve)sJVYC!nrAHpV~JiCH3b7AQfAsEfzB$?RgU%+x7jQ_5XQ8Gf*N`i<1mZE zg6*_1dR3B`$&9CxHzk{&&Hf1EHD*JJF2glyBR+hBPnwP@PurN`F80!5{J57z;=kAc za65ouFAve7QEOmfcKg*~HZ04-Ze%9f)9pgrVMf7jcVvOdS{rf+MOsayTFPT}3}YuH z$`%^f$}lBC8IGAma+=j9ruB&42ynhH!5)$xu`tu7idwGOr&t=)a=Y2Sib&Di`^u9X zHQ=liR@by^O`ph|A~{#yG3hHXkO>V|(%=lUmf3vnJa#c%Hc>UNDJZRJ91k%?wnCnF zLJzR5MXCp)Vwu3Ew{OKUb?PFEl6kBOqCd&Qa4q=QDD-N$;F36Z_%SG}6{h2GX6*57 zRQIbqtpQeEIc4v{OI+qzMg_lH=!~Ow%Xx9U+%r9jhMU=7$;L7yJt)q+CF#lHydiPP zQSD=AtDqdsr4G!m%%IauT@{MQs+n7zk)^q5!VQrp?mFajX%NQT#yG9%PTFP>QNtfTM%6+b^n%O`Bk74Ih| zb>Fh1ic{a<8g<{oJzd|@J)fVVqs&^DGPR-*mj?!Z?nr<f)C8^oI(N4feAst}o?y z-9Ne339xN7Lt|Tc50a48C*{21Ii$0a-fzG1KNwDxfO9wkvVTRuAaF41CyVgT?b46; zQvjU!6L0pZM%DH&;`u`!x+!;LaPBfT8{<_OsEC5>>MoJQ5L+#3cmoiH9=67gZa;rvlDJ7_(CYt3KSR$Q#UR*+0hyk z>Dkd2R$q~_^IL2^LtY|xNZR(XzMZJ_IFVeNSsy;CeEVH|xuS#>itf+~;XXYSZ9t%1moPWayiX=iA z!aU~)WgV!vNTU=N;SpQ((yz#I1R#rZ&q!XD=wdlJk4L&BRcq(>6asB_j$7NKLR%v; z9SSp$oL7O|kne`e@>Bdf7!sJ*MqAtBlyt9;OP3UU1O=u6eGnFWKT%2?VHlR86@ugy z>K)(@ICcok6NTTr-Jh7rk=3jr9`ao!tjF;r~GXtH~_&Wb9J^ zd%FYu_4^3_v&odTH~%mHE;RYmeo+x^tUrB>x}Is&K{f+57e-7Y%$|uN%mf;l5Za95 zvojcY`uSCH~kno zs4pMlci*Y>O_pcxZY#?gt1^b-;f(1l9}Ov7ZpHtxfbVMHbX;579A>16C&H5Q>pVpH5LLr<_=!7ZfX23b1L4^WhtD?5WG;^zM}T>FUHRJv zK~xq88?P);SX-DS*1LmYUkC?LNwPRXLYNoh0Qwj@mw9OP&u{w=bKPQ)_F0-ptGcL0 zhPPLKIbHq|SZ`@1@P5=G^_@i+U2QOp@MX#G9OI20NzJm60^OE;^n?A8CH+XMS&3ek zP#E7Y==p;4UucIV{^B`LaH~>g6WqcfeuB#1&=l!@L=UMoQ0$U*q|y(}M(Y&P$Xs&| zJ&|dUymE?`x$DBj27PcDTJJn0`H8>7EPTV(nLEIsO&9Cw1Dc&3(&XFt9FTc{-_(F+ z-}h1wWjyG5(ihWu_3qwi; zAccCjB3fJjK`p=0VQo!nPkr0fT|FG;gbH}|1p`U>guv9M8g2phJBkPC`}ISoje6+? zvX|r5a%Y-@WjDM1&-dIH2XM}4{{d&zAVJQEG9HB8FjX&+h*H=wK=xOgNh8WgwBxW+ z0=^CzC4|O_GM>^_%C!!2jd&x*n2--yT>PZJ`Mok6Vf4YFqYp@a%)W}F4^DpKh`Cr7 z{>Z7xw-4UfT@##s#6h%@4^s^7~$}p2$v^iR5uJljApd9%#>QuxvX+CSZv18MPeXPCizQ*bm);q zWhnVEeM}dlCQP*^8;Q7OM|SSgP+J;DQy|bBhuFwJ2y*^|dBwz96-H;~RNsc}#i= zwu`Tp4$bwRVb7dxGr_e1+bJEc=mxLxN_f>hwb#^|hNdewcYdqXPrOxDE;|mP#H|a% z{u8#Vn}zVP(yJ}+-dx;!8<1in=Q8KsU%Q5CFV%5mGi8L;)*m%Vs0+S`ZY(z7aZ$VCjp?{r>C<9@$zVN;LVhxzPEdDPdb8g<)pckA z?mG@Ri>ode(r|hjNwV#*{!B^l2KO@4A+!X;#PW#?v2U!ydYIFHiXC3>i2k7{VTfji>h z8-(^;x!>f)Qh$mlD-z^1Nxu})XPbN=AUsb%qhmTKjd=1BjKr(L9gb1w4Y8p+duWfS zU>%C>*lCR@+(ku!(>_SA6=4CeM|$k4-zv|3!wHy+H&Oc$SHr%QM(IaBS@#s}O?R7j ztiQ>j^{X)jmTPq-%fFDxtm%p|^*M;>yA;3WM(rLV_PiB~#Eaicp!*NztJNH;q5BW$ zqqlfSq@C0A7@#?oRbzrZTNgP1*TWt(1qHii6cp5U@n|vsFxJ|AG5;)3qdrM4JElmN z+$u4wOW7(>$mMVRVJHsR8roIe8Vif+ml3~-?mpRos62r0k#YjdjmK;rHd{;QxB?JV zyoIBkfqYBZ!LZDdOZArQlgXUGmbpe7B-y7MftT;>%aM1fy3?^CuC{al$2-tfcA?d) z<=t7}BWsxH3ElE^?E&|f{ODX&bs+Ax>axcdY5oQ`8hT)YfF%_1-|p*a9$R~C=-sT| zRA~-Q$_9|G(Pf9I+y!zc>fu)&JACoq&;PMB^E;gIj6WeU=I!+scfSr}I%oD1fh+AQ zB^Q^b@ti5`bhx+(5XG5*+##vV>30UCR>QLYxHYY~k!AR`O6O_a3&wuW61eyHaq;HL zqy@?I*fmB)XY;Z@RH^IR|6m1nwWv>PDONtZV-{3@RkM_JcroRNLTM9?=CI}l%p86A zdxv|{zFWNI;L8K9hFSxD+`-pwvnyS|O?{H-rg6dPH<3oXgF0vU5;~yXtBUXd>lDs~ zX!y3-Pr9l;1Q^Z<15_k1kg|fR%aJKzwkIyED%CdxoXql=^QB;^*=2nVfi{w?0c@Dj z_MQEYjDpf^`%)$|4h>XnnKw05e5p4Jy69{uJ5p|PzY+S?FF~KWAd0$W<`;?=M+^d zhH&>)@D9v1JH2DP?tsjABL+OLE2@IB)sa@R!iKTz4AHYhMiArm)d-*zitT+1e4=B( zUpObeG_s*FMg$#?Kn4%GKd{(2HnXx*@phT7rEV?dhE>LGR3!C9!M>3DgjkVR>W)p3 zCD0L3Ex5-#aJQS6lJXP9_VsQaki5#jx}+mM1`#(C8ga~rPL{2Z;^^b+0{X)_618Sw z0y6LTkk;)quIAYpPY{)fHJLk?)(vxt?roO24{C!ck}A)_$gGS>g!V^@`F#wg+%Cok zzt6hJE|ESs@S^oHMp3H?3SzqBh4AN(5SGi#(HCarl^(Jli#(%PaSP9sPJ-9plwZv{ z1lkTGk4UAXYP^>V+4;nQ4A~n-<+1N)1lPzXIbG{Q;e3~T_=Trak{WyjW+n!zhT*%)q?gx zTl4(Gf6Y|ALS!H$8O?=}AlN=^3yZCTX@)9g5b_fif_E{lWS~0t`KpH8kkSnWWz+G1 zjFrz}gTnQ2k-`oag*031Nj7=MZfP}gvrNvv_crWzf9Cdzv^LyBeEyF2#hGg8_C8jW)NCAhsm2W_P21DeX7x$4EDD){~vBiLoby=d+&(;_f(?PMfamC zI_z%>Nq-rC%#z#1UC49j4@m63@_7LWD$ze=1%GPh`%@PB7yGH6Zh=1#L%&%hU7z%Y zs!IN(ef@!+|1YR28@#kw^XR= zxB$*nNZm7Y@L0&IlmoN}kEI?dBee+z+!MWCy+e4P4MYpOgr}2Q(wnR1ZiA>5_P*Cg zB4BMlcx?(v*+V3O+p~Buk;wIN6v!Ut?gYpl+KFu~elf}{E4`9+lcR0k$bC>+I zWxO5jD8sYPbMS)4c3i2UojI4T7uzE*Zz;POw{0d0`*iHJ%(Pb=sa^pV{t_JtHoPeC zX+t_k*=D%+Sv#+5CeoRfI)G`T90~AE@K9RaFR%8*w#*x9>H$ahFd>PUg_zP`VVPSR zr#Rb;I--8Rq;eTBju;dx2cmZ9Al>aiDY z#7(4S(A#aRvl7jm78sQ+O^S5eUS8|W%5@Pt9fm?J=r`~=l-gdv(LB~C-Gi#srwEDQ z4cCvA*XiRj9VDR6Ccy2k(Nvxic;~%YrfNeWl$cJpa%WO_4k?wxKZ{&`V#!&#jV@x+ z7!!YxOskc;cAF~`&aRWp8E)fnELtvb3-eHkeBPb~lR&iH=lZd^ZB(T6jDg5PnkJQFu9? z+24ww5L%opvEkE$LUHkZDd0ljo!W}0clObhAz`cPFx2)X3Sk91#yLL}N6AE0_O`l| z7ZhaKuAi7$?8uuZAFL(G0x3wE<-~^neGm=*HgJa(((J;yQI$NB)J;i0?vr`M1v+R? zd+{rD^zK}0Gi!2lXo0P+jVQ$HNYn^sRMONYVZPPT@enUb1pHHYgZMo5GN~SIz*;gv z1H<4(%53!6$4+VX_@Kp!>A9wwo{(KdWx)ja>x3&4=H(Urbn?0Vh}W3%ly5SgJ<+X5?N7-B=byoKyICr>3 zIFXe;chMk7-cak~YKL8Bf>VbZbX{5L9ygP_XS?oByNL*zmp8&n9{D42I^=W=TTM4X zwb_0axNK?kQ;)QUg?4FvxxV7L@sndJL0O12M6TMorI&cAL%Q464id6?Tbd_H!;=SRW9w2M*wc00yKVFslv|WN( zY7=Yikt+VY@DpzKq7@z_bVqr7D5B3xRbMrU5IO7;~w2nNyP7J_Gp>>7z?3!#uT4%-~h6)Ee1H z&^g}vZ{g}DIs@FDzE$QG_smSuEyso@I#ID3-kkYXR=nYuaa0{%;$WzZC@j)MDi+jC z!8KC;1mGCHGKr>dR;3;eDyp^0%DH`1?c7JcsCx$=m(cs^4G& zl@Fi8z|>J`^Z-faK{mhsK|;m%9?luacM+~uhN@<20dfp4ZN@qsi%gM67zZ`OHw=PE zr95O@U(HheB7OBYtyF=*Z5V&m?WDvIQ`edwpnT?bV`boB z!wPf&-@7 z0SoTB^Cy>rDHm%^b0cv@xBO%02~^=M79S}TG8cbVhj72!yN_87}iA1;J$_xTb+Zi@76a{<{OP0h&*Yx`U+mkA#x3YQ} zPmJsUz}U0r?foPOWd5JFI_hs_%wHNa_@)?(QJXg>@=W_S23#0{chEio`80k%1S?FWp1U;4#$xlI-5%PEzJcm zxjp$&(9f2xEx!&CyZZw|PGx&4$gQbVM|<2J&H7rpu;@Mc$YmF9sz}-k0QZ!YT$DUw z_I=P(NWFl!G-}aofV?5egW%oyhhdVp^TZH%Q4 zA2gia^vW{}T19^8q9&jtsgGO4R70}XzC-x?W0dBo+P+J8ik=6}CdPUq-VxQ#u4JVJ zo7bigUNyEcjG432-Epy)Rp_WDgwjoYP%W|&U~Gq-r`XK=jsnWGmXW6F}c7eg;$PHh>KZ@{cbTI<`ZP>s(M@zy=aHMA2nb(L0COlVcl8UXK+6`@Di+Wai;lJf^7s6V%NkKcad zDYY%2utqcw#CJFT9*V9U_{DyP&VYb)(6y`Z%Rq& z!PTtuI#psBgLPoNu{xvs^y26`oY;p!fE=bJW!cP^T>bUE*UKBV5Bd%!U{Q5{bKwN> zv)pn@Oc{6RyIS>!@Yvkv+hVLe+bmQ6fY2L}tT)Vbewg8`A`PFYyP+@QmL?b{RED;; zR6fwAAD}Ogejah(58bv{VG&WJhll7X-hjO9dK`8m5uFvthD1+FkJtT_>*{yKA(lXx zKucHMz#F_G)yTJw!)I3XQ7^9ydSlr9D)z?e*jKYE?xTKjR|ci30McU^4unzPsHGKN zMqwGd{W_1_jBQ_oeU^4!Ih}*#AKF%7txXZ0GD}Jzcf+i*?WLAe6#R_R-bSr17K%If z8O2SwYwMviXiJ?+$% zse=E~rK*PH@1Md4PFP)t(NhV%L3$657FUMap?fugnm3|N z79w3|qE%QyqZB}2WG&yc>iOaweUb`5o5p9PgyjqdU*sXP=pi$-1$9fGXYgS2?grS6 zwo#J~)tUTa0tmGNk!bg*Pss&uthJDJ$n)EgE>GAWRGOXeygh;f@HGAi4f){s40n?k z=6IO?H1_Z9XGzBIYESSEPCJQrmru?=DG_47*>STd@5s;1Y|r*+(7s4|t+RHvH<2!K z%leY$lIA{>PD_0bptxA`NZx-L!v}T4JecK#92kr*swa}@IVsyk{x(S}eI)5X+uhpS z8x~2mNLf$>ZCBxqUo(>~Yy4Z3LMYahA0S6NW;rB%)9Q z8@37&h7T$v2%L|&#dkP}N$&Jn*Eqv81Y*#vDw~2rM7*&nWf&wHeAwyfdRd%`>ykby zC*W9p2UbiX>R^-!H-ubrR;5Z}og8xx!%)^&CMl(*!F%or1y&({bg?6((#og-6Hey&3th3S%!n3N|Z2ZCZHJxvQ9rt zv|N#i*1=qehIz_=n*TWC6x-ab)fGr8cu!oYV+N)}3M;H4%$jwO>L!e53sxmJC~;O; zhJw|^&=2p!b8uk{-M|Z*J9n0{(8^>P+Y7vlFLc8#weQMg2iB8MFCe-*^BJV6uVWjg zWZe{-t0f67J<|IIn4{wsKlG*Amy{-yOWMMW)g}rh>uEE;jbkS-om>uAjeTzCg51683UTmY4+yT zW!qe`?~F{~1Y>mPJ9M0hNRBW$%ZwOA-NdIeaE6_K z>y8D3tAD7{3FouIXX9_MbY;zq%Ce0}VmT;aO~=*Mk4mflb_i4CApxEtZ^TDNoOzy_ z-eIE(&n1Vz*j&(BjO*fVvSCozTJU4?tWC8m4=d|D{WV0k+0M2!F1=T}z7V4-JA*y( z!;H(sOBmg=%7p&LLf%z%>VgtdN6jl2y95aXY}v9U;m~YWx{2#lwLpEJWGgs`sE*15 zvK`DtH-Q^ix>9@qVG+d*-C{lYPBbts1|%3!CkLP1t4iz%LO-di4lY%{8>jd{turVrD*_lLv!ShQC~S#SXjCO?##c zh2aZKVAHDf1sQpZiH^C7NRu?44JuEp?%W4-?d;Dg z;`gKA9$oC{WlQuT?fex!ci3GJhU;1J!YLHbyh8B-jsZ~pl59LGannKg9}1qxlbOOq zaJhTl zEJ`2Xd_ffdK^EE1v>8kUZG`eMXw(9S+?Lxx#yTUo?WdV}5kjC|glSJqX zv8RO|m#Ed@hW=};Yfl&2_@11Xm}pz0*SRx%OH_NODo@>e$cMAv(0u`~Yo|qbQ~mzA zMKt^U+GIXKH^xuD9n}NfU|?ZTOSS>XJwlg`lYHgea)!ZR?m^=oj+qyKBd6SJvPZk* zwc-2$b%%V~k$5{=(rG!OcR{;u2V3um|C+oT5F?rt`CER|iU9-!_|GxMe^!f$d6*iz z{?~JnR84mS+!gFUxugG?g9uGFI(?Q0SADS8=n=#aCK^`6@rm4r=LJTBm;)cY zm_6c5!ni$SWFOuj36eKau>6=kl_p=-7>VL_fJuJZI}0=3kASf|t;B~;Mt(vuhCU+c zKCF@SJ5#1>8YLfe{pf?sH*v6C)rOvO1~%@+wN}#>dkcrLw8U@xAySc{UeaP?7^AQ5 zmThfw^(i@*GMlM!xf+dzhRtbo8#;6Ql_s$t15q%*KeCm3`JrXnU*T^hV-aGX)bmxF z;O%jGc{6G+$gZ$YvOM2bZ!?>X<^-D zbT+YCx722}NY88YhKnw?yjF1#vo1v+pjId;cdyT*SH@Bc>6(GV*IBkddKx%b?y!r6 z=?0sTwf`I_Jcm(J8D~X@ESiO`X&i53!9}5l}PXzSYf9 zd&=h`{8BP-R?E*Nk$yzSSFhz2uVerdhbcCWF{S7reTkzXB;U@{9`hvC0AscwoqqU( zKQavt5OPm9y1UpKL%O(SWSSX=eo2rky_8jJ-ew7>iw~T=Xrt3EEzc!slebwG)FrE> z>ASkjJk%#@%SFWs-X4)?TzbBtDuwF#;WVw}?(K`UYqm`3vKbFKuqQ8uL2Y5}%T0y5 zia#E?tyZgnuk$LD^ihIn(i~|1qs(%NpH844QX-2S5E)E7lSM=V56o>5vLB^7??Vy_ zgEIztL|85kDrYF(VUnJ$^5hA;|41_6k-zO#<7gdprPj;eY_Et)Wexf!udXbBkCUA)>vi1E!r2P_NTw6Vl6)%M!WiK+jLRKEoHMR zinUK!i4qkppano|OyK(5p(Dv3DW`<#wQVfDMXH~H(jJdP47Y~`% z#ue|pQaVSv^h#bToy|pL!rWz8FQ53tnbEQ5j#7op?#c#(tj@SM2X*uH!;v8KtS5Fo zW_HE8)jSL zYO}ii#_KujRL4G*5peU)-lDW0%E}!YwL#IKUX_1l9ijy~GTFhO?W^=vEBe?m+tvBe zLaGWcoKg==%dO#6R}`U0>M)2+{b*~uamlaUNN<_NVZTGY4-(ORqK6|HvKFMKwp6^L zR+MC^`6^|^=u^Do;wy8mUp^Oct9~=vQ74vfO-m&Q0#~-mkqkpw&dMkVJ(So<)tf3h z46~mW_3T@Mzh<2XZYO7@F4j|BbhhXjs*hayIjTKyGoYO}`jEFn^!4Y! zL30ubp4U(r>Nx&RhaJkGXuRe%%f%D;1-Zdw2-9^Mq{rP-ZNLMpi~m+v?L=sPSAGcc z{j+Y!3CVrm);@{ z;T?sp1|%lk1Q&`&bz+#6#NFT*?Zv3k!hEnMBRfN47vcpR20yJAYT(5MQ@k;5Xv@+J zLjFd{X_il?74aOAMr~6XUh7sT4^yyLl%D89Io`m5=qK_pimk+af+T^EF>Y)Z{^#b# zt%%Bj9>JW!1Zx_1exoU~obfxHy6mBA{V6E)12gLp-3=21=O82wENQ}H@{=SO89z&c*S8Veq8`a3l@EQO zqaNR8IItz4^}>9d+Oj%YUQlb;;*C0!iC&8gaiDJ)bqg(92<>RbXiqFI3t#jqI%3Y( zPop=j=AyLA?pMYaqp0eHbDViOWV-5IUVwx+Fl6M54*?i+MadJHIRjiQoUe?v-1XdQ z5S305nVbg|sy~qPr2C6}q!v)8E%$i~p5_jGPA0%3*F%>XW6g)@4-z73pVcvWs$J2m zpLeW4!!31%k#VUG76V__S**9oC{-&P6=^fGM$2q<+1eC}Fa2EB3^s{ru^hI}e^KPM zMyj;bLtsRex^QMcgF)1U0biJ|ATXX`YuhzWMwP73e0U?P=>L|R?+13$8(PB23(4Js zy@KS0vvS~rk*^07Bd4}^gpc|e5%248Mei_y^mrD;zUYniPazU>1Dun%bVQ0T7DNXr zMq4Y09V_Dr1OQ$ni)BSyXJZ+D7 zXHh02bToWd;4AlF-G`mk23kD=$9B)}*I@kF9$WcOHc%d6BdemN(!^z0B3rvR>NPQ? z+vv#Qa~Ht|BiTdcN;g6;eb6!Jso)MFD3{sf{T;!fM^OwcEtoJI#ta?+R>|R;Ty2E% zjF8@wgWC=}Kkv52c@8Psigo4#G#E?T(;i}rq+t}E(I(gAekZX;HbTR5ukI>8n5}oC zXXTcy>tC{sG$yFf?bIqBAK3C^X3OAY^Too{qI_uZga0cK4Z$g?Zu$#Eg|UEusQ)t% z{l}Zjf5OrK?wkKJ?X3yvfi{Nz4Jp5|WTnOlT{4sc3cH*z8xY(06G;n&C;_R!EYP+m z2jl$iTz%_W=^)Lhd_8hWvN4&HPyPTchm-PGl-v~>rM$b>?aX;E&%3$1EB7{?uznxn z%yp0FSFh(SyaNB@T`|yVbS!n-K0P|_9dl=oE`7b?oisW)if(`g73bkt^_NHNR_|XU z=g?00`gZRHZm+0B(KvZ0?&(n<#j!sFvr|;G2;8qWg3u%P;M1+UL!9nj)q!}cd}jxK zdw=K$?NuLj?2#YzTCEw1SfLr#3`3x(MB2F(j!6BMK!{jXF%qs;!bIFpar}^=OYmYm z86RJ9cZl5SuR6emPB>yrO)xg5>VucBcrV3UxTgZcUu(pYr+Sa=vl>4ql{NQy4-T%M zlCPf>t}rpgAS15uevdwJR_*5_H?USp=RR?a>$gSk-+w;VuIhukt9186ppP=Lzy1L7 ztx(smiwEKL>hkjH7Y))GcUk`Y z5ECCi%1tZE!rM4TU=lk^UdvMlTfvxem>?j&r?OZ>W4w?APw@uZ8qL`fTtS zQtB<7SczI&5ZKELNH8DU6UNe1SFyvU%S#WTlf%`QC8Z+*k{IQx`J}f79r+Sj-x|4f<|Jux>{!M|pWYf+ z-ST5a#Kn+V{DNZ0224A_ddrj3nA#XfsiTE9S+P9jnY<}MtGSKvVl|Em)=o#A607CfVjjA9S%vhb@C~*a2EQP= zy%omjzEs5x58jMrb>4HOurbxT7SUM@$dcH_k6U7LsyzmU9Bx3>q_Ct|QX{Zxr4Fz@ zGJYP!*yY~eryK`JRpCpC84p3mL?Gk0Gh48K+R$+<|KOB+nBL`QDC%?)zHXgyxS2}o zf!(A9x9Wgcv%(sn!?7Ec!-?CcP%no4K?dJHyyT)*$AiuGoyt=pM`gqw%S^@k8>V0V z4i~0?c>K{$I?NY;_`hy_j6Q{m~KDzkiGK z_ffu;1bT+d;{6`SacCO z!z#1#uQP5`*%p&Urrk=&0`h1PBJxx*71yfl$|0Lt5_Lu$sO+F4>trJ6BS{J-of(R; znqrX@GUAyelkAOB;AqN)kur^1$g*t8&pGsyNZ|n42P$;s}e=Ef0&U zeA`jZs*E%l;3wd$oo^8Kh+#$+NzBNTi(70iEH)=Otim-ufx?&1Fe!w}-a_WL z3b9@#v&pt7wVF#bkr-YWhG|rhfwMABMZ<*Ku}@(4l8Aw|vSX#w9;23Ms1w zSC<+Ir!HNnF0m<+sQEdpqfFZn$+xA08nrn>k%Grb^0QdkgbOV;Kit2W`YwlfP5RRT2G3s4h?t5)!UZt~ ztK#FBL&P1pKsrye8S{&w@^ExelK;!LKh>=_q@VYF? z;_>~#$&OM13&!w@lx3P~g8~N3^wGM$Ybs$gFU+qlyxpp`?%oPWZNF-V;}NI47Q3^L z6zQ5TW`2EtX}l&7$2>xy4$xi;EXMN9^>l^O zpX}dt^G-p)6VSPIUolW9$svfNPfx=thP`;1S+wNs+PSh6QZ=X3FEu=#Ih!t_jC#tY z7t4@L1kbqL!4$7DY4QrHWPRfRvrE1hZcJR!wneIey(qiO(&qR5njE7~Vx5a{vafU= z)ya$}INqMlnsl?CHs*Gm@?JIPF$yE8pr2XE$;!z~-)=K?U$T3tT|t*z%Y~?_FuuG# zdxk5YL7D5##gr{wj@q_8USae@D&~NiU&5b$mcj$)ciL;Pm?1INBK8<9Uy##y@F;CU zG{5BquPJ2$`&r0uq3sHTD{+s!8^B47^RipsiHgpRoUp)5`1Om|oJQYZFd->&WM-2Y z+jMSmGg#v0-K{lm@K7En;FAw9nqm8(_94>4itl{!&h$c5Jhb(>aE;^WG5a0ho_P#k z=`>n+Y4`!6VFcFp<(fDGn0XZI%j$-p+V`Wfsdx5gviUanQCQKMLC02L-kZhqAFDJKEt24JM32 zX>A|&bwLR-xGzX@mrw_b>J0xDVriQ#YH{AYpBzPxW*}IViqyF8u~q zU?C~D8N<#3QCgHa! z%i?KtB+B&v;W5W8oy2USy=LKTj+&_Z`QpJr`GcqVwtDRmc6|RBE?NV#eo})g*6rN} zhVAR1l^#prL+5!{^P0NZ+RejdQ+Ik@^7pH{{xCL;z5Ef)do(8!08u9ieL2#1dVKMYKYZxBy98#CFs?lUx*#_eEO!>K!DVcH zdGN^HncO_w*;SJDV*_W|+&${EN7qQ1S1yi}H5b=0yu!PJ`dqxvn|pgs`A^1u$=l`! z7AEW-85?pZc4n>skM$;VkgurkG)2ecbYIlvN>b%UaLQareR0du>kXIMne04Rjh>ja zOJm_v=A~pE$}gH^TK6G5iT7xseUX#3keV|HJR9+g$u1o)wk^sTKGu+^WK4Dd6|PCC z*&kMT2?F_IS8|8B=Pgvkp`~)4nQ&T0-*6`YgSiY(GYn4))c1*2(ByIjf}HX8)B7rC z&d5F1D8EZT|BW`XU*~9w2)wL&5BLA(s{AwN`Cq`IT#a9vsG4Y>{48Y5F*r`NXsH?- zVTMpq8!(pQLZuRFNJ`bUqAX!QjVN;EgzPSiZEP^R9oBqXv+2Lf41bTiXwO@$_dEag z)4$-NHxpbc;(k6S`E9%V_Z7f<$NO$<=f@U!1BT{FA;w$gJM_RPC15g24TclHHNn= z%3))Msl?FP(v#6f=JB3R3(=~4{1-z9c(u5S4a?YsMm`I{<$RtS!4}}}Ls16B*~;RA zCFE^3T{I0u&U)AygIU#$7lBjVWRxt%JD|3mUGu4?1k3&FxUGkmjn>V`{dku=<;nM6H?3 z8xw;O<`w#tgfx@pCrNvj1x6M;bIoMn)ImU<%Z(~Dvg^o_X`D1>gDTAF1JlQ` z?Y0Rk=%+L12xR2Um(UM}Q!Uv+W%0yiatJP4)MXpxqnE?ceur3dpWVT$$C7W(Ad7OQ zW(07FjoY#!D~GG+S__T8FK&rdV8o2D$m<$v|3OeBckZrXV6vJB?+I0Q&55akuCrPQ zZU*OQXVhoj-{S`xTc(oCS}h)dA5qXgY;`LeY~fN~j3}d%Wj}YsHH!*FgWWVKtEo7% zHJCka&s(kt!Ix0uOwK~ysoe-RpANP#;|q6T$^GHRvO+{woF|P1&w_Kq=aoSqGzz;$ z*Wd$VhR9xrypy(YpJ6@06_07w6Ovvj^KcA}U4Pw$jA_~vwQAZkdkBBr8`%yn^BXnF zY|1lx{c2Y~DyMp-ZA=8M4nE-5zQ0V;O>J}Y+q0W4x)$_;wo<8D%n z!`fVX#C)T*rrWYPfxn@Q6qUT_)*!tiSediBO-cWahFdGUC+AFOSeqs;VqMXEvu z*%o*tngNJ+?;X}x>R4%u!~{AX)S}i#{yd>aw4uJZu8tysnfsX->l#F&^>#dTfy;r$ z9&&l4K^kS`n=Z?f{iVrgD@h2mp&`v~L{?|ix`67n;1n!!9Q9;ZT8{Z%tjs%KO;cRe zPUo=>|D{SI8*Zta^OK+@3{;6}Prl^Xo^!LgN89!4j#^fkSbG(fbc|}r9kfF?xK6Xn z1YQ@5h8GS>!!w45QHt_v&=*8WKMCyg^sG1>yC2jI6$OMH3*2k5pYYxNp2ruxMERnP zt>?dmG`|IjgqE?Y zfm?|c1z(LRCd0xBr_~~k6@@Vn{e_;CW=N{cxgOB7t*8bx)NVks2EHMQr1{_-@iJ4Yow z&jrCB7?wL1L^MwKQ<}W8nuXleT$a{lrIC+Lh^3X%lVS-Jj*O+ZeScuA=u{mU3<%Ru z?1Ta~3{lxdLZaLB{rnA*1cW#L6jcEUfR8x&{D2H-1!dw^=@(e4V zBXPJ#v7Vw?G}0~t&j@4v@@(6bhC0Wq;*N=}g9R&l+ltUp+C|&cLHD8B64iDaD#Ufm zzBugB@HF5v-1b26O3@fuv`ye?Q@;2{aG^N4zvx1n3|nzp+b3F$EEwVhHfn!wWrHgRcNDg+Ls6o&2!~fr|<5?3~C$xM40nq>h0pa?ejgP_Um+osTtap#sTgEz{+V!DVgg2c|zr&qy`*v|%k2qN4o$ zG~S$V&%H9mvmN_*yjnif&S_LWiH3GhJ<5yURu!%M^{oke1@N`vWL^&A({Dt^_*?zF zlEwE&e!1B;B=VjSvmW&#RI9p;59vL-zmfhqVSAUbyVBG~M#rW`BM9#;U-<(X5@k?g z1!baee)903$R-8_!>)ezvDF&ECABnUmq@;}jy$N;%haQ)b&?*%Pj@Zx<&(TSPsQ!- z_%e!bOqU&-@>_GE{lssw9He!Q4iIrZC?rGvemrxq=ZuF&VNVbL`14U6X|at+LC)@` zR8$!C=E++&j+(pty&FMQAxl0-G#pW(N>jQG1P2tvmz#rF&e3`|lwl z_vYYFF~1Qo=)yCVr!-;LzgT&I7&7|z9fN9h9n@0MDUi3~0_6bOhc@D2&^ z3duiUjQ;{H{ue#*zw_EcH6#7eEU^8|o4Z+g;kYqSw5Srw;B7BSV3Jyv$P(N)*#_vK z^_85Oc-QFw)3z4o&}w$QRS)*91nMOQ=(_P~ZMIbN`|4_ZI<*?Q@0jnHODEZYb7YNa z#+SIKx9tP({1fk!sZ{@be~5nfcU3c!&;~H>pIeMLx@HGdj_QX_a-&5s5M$~&{a`c# zA&Ak(q{ef>Gz5c^Ws>UyiFa*j#b4!CQU-ibzM|cGDhWsZV zPSM2}nveE~=5PtYB;8~Plz235H}`j{M)BvqI^wQGEc z9rbH|h#k#qFbKto=fbGP=fs$DGd|LTF%%-<=*%*scyqTgW;|&88`L-(y7Tth9HVaR zp}o`R$h{t3hYWj)%I-A!LZ{EALwwb@{TtF^4+X_7df_N(Eq?3Fxa#anAZ860o$rDoQyT;#i?`Kwurj4}BKysK7>nVQmatS5Nsshp{j zyS7G_fo*7u(Q+P%>ZN*aCp~9=tjao5cGcNm4 zx^?@S<p-aIyE;r_=AYe)b9h zzj^rv6QQ-}v0Cf7A|#5k>wLX}mH8FX52>q6R``I5aj(>*f3i+(F`6LcB&TwV1f zpOPb`4mv{k7WTW=>?1?FmVkn5!big+_SX>=c}=YQa&e+ez~sI1NEr5z9CTehje?9U zeQGJpCSAGIe8Q0$Z1}|?U+hS2PcEBSm6v21_B`XcXFU*4cyc40;{?Dg}W`~c$C^r1u0R%RqHCJ>{7(eSO$^7u3m~WQPS^$-(q&7a_2fFWJdGZdcs!8Yp93#wJGXC#+@-XFx|>~ zWg5SUiLzII8_j2bhj18wt_C_~^6>s+zj6K$qg)Pb`PYDVX=J7L+tMgt(x9w6zse)J zrWWHgUJmp%E@Gd$ZWQOvCOmDbvme4&D>*tpQvISkpoe!jph2$(V=}62#;K-r=px{4 zV=SM&(@pKFvW$W==2-~S-Tw&1LunP`!S#K40}R=1o4hYtUAAOR^O1p%&9v1;e~Mv!?1a_tMZAvG7he; zE(!g+ibYMAV|59+8DrA`A5jc3-gU&9%Ehp+qlG849RhUfZbL>lW#RoS2DMsm_Ux=T z|K|#Hv5ed&H*>KDzXXiopOce3I3(3%28T)wg51@M4yl?`judhBRFQ^Vxk)BpzD!Gdf#ou14?8X#gV$8aQC5b!&aX#wKA5qk_*wO!kHj9#S3 zfpfT#SU6nAV|8c)SSQA-8;;j_hf|h4AmqgK#I6X|Bi^JQUvhn%9ZFX#PLyfSQu$;$ zzM^i?+bX!Uuk9@9_E&+n1OxbcWwm-2^nejN=dF`W8^)>>#Cc$L@=1?vuQ#K}JjXsYEEOT{m5D-P)P}ys7UNH36m!HX{b7{zuY4R~4pfGV5Vi^-?R147 zD%l%2-?es1+bV6G4n$6GR4p(3ko&IXA+~(xQE|GL`XUzQacBze?)~!~HQF&6=utZ0 z$Wf?>HaxHaz7Vdtqw>KzA8y(;k}a|po=YGKx1k_^^zUDdNeGE>hyCRQSXcu*jL_YU zN!=4suP9`?J6XnmB6T|AChiP{Y{!9n6(*xTCBh?gJ`=4!L#e({8F5LQ^NHK@iL&LB zgD@%`@R`-CxQ8~aQh5hAwL^!2&`ZWwUt^g&CcMWa%{?u|%Q0S+=Zk`S=5!;nMj;)A zUkgmCf6>4`t~Sf4PcwYnqZbg3OF+Q)geEkt@yolApC*~;%L4b=P0^y0Dri{El=}4S z$X4s4+!}Hx*_v{nC%i<}C)#4{GV~O3b$(7WKQgmbWK*gp&bxjZMh%oA%7c;!x(UHc zJb*6c%(FyzY$UeZKe>)OnXJ6J#+#kL>6H@(rRUrJPT&TM*qJ(Zen2c1RTdSPih#F! zhNn89$nUneJz{GFdfXdLUFQ%+Dp(t{OZ5rb!Y)=Jk+Cg+kyn#$K#0-9B_~2J6CFQ) z1(JpSx*^=Z{P{OsfeXY>FUNrUD+Bd}BJlGUV)>t%g8pBcg8m;&Wk(?Kfx+?rP={4# zXB4Stq}8RQ<)@~n=q9G;4pa~n<(02#W|Wy4l$aV?SeP4F*wr1~;SrRXSeV$3Xs9OV zWaJsB+vFK#C#L0Fk3jzx>V*bA5$Nc!#SHLCaDciOczy_C>}F+a zO7CoDVrJ#&`nShmSM0V2BSt!Z(j+N{2qK1%?~(#uI1gQ1s>&W^0~xV~$nW z4pqV9;_`dmw}E=^?_$ry*6P1uvj2Kx3FG%^d_azjDv%??{GVSJHvTIB zZQ?5GU}py;Zpm5Mn*nKY?m&d}e?_5F)%1b9Xf%E>*l60e2)o*ydBme)*G+*;5h2RXO{)0P3jBG!L33uaJwzU(K(pv6~PPVzduR2|hw*i9w{(m4H zBS^uZ&rjFbkp|+v;LoK#iFk42d*MUii-&oRJm_hgMI7Ij!|4F79K)8we%~Y;)z64e zS$jZBbNXza<>?Hnzd=__%v}Z)E?tM3@C=^0c3OGpH?ILc;6K7CJHRW^0o;XM&? zRyJSjn0{#e%)dIN5KGml)+6Tt5Rk%+b&h7b*=OocxlFgC6=_Yeu5~|Rx0`VjhDk+} z<1I9`MFiDJFW4|F^V5yTKG8Gp1{v8H^iL1$d}T)KJxxi)uAvV7%^lcAWo61_;M?f+ zt*ei7zH!X4`WH_gd3aFWxuF$D(d1WGLYmrxhA3;SE)ls3ScyeKnCu_!>V(aj4|d;{ zr3d@%!lvC;Q^la)q%*jr_6ZQMqc}5=!j^g{!Y;_gLZ_z1mP1(2ofH+aMc@mO-w%0& zMcrLi=K@|Aj0dKfdi1zjUc8csnps7~J^oOr(crZ%-P>rt(vk^@obDhK%gz+COLyaF zOK@m(fV>GSpm|uvel^6QZJ`+Zq9q=64v>|~qAQ-QRn9AVlh7dTet}Jl$Bf8BlOeSX zRdEVg+lIQiT7;oB750LzS@a{VP{TS=prLli-EQdbR#XfrQuPc7PpO_wgy!O)Ji!_h z%o-Ied!{_J3E>-Q7Wy8R*O)${Vc7n6e#~E8k>#6Nd>OC{o&rDr7D4^1=l-n=Dj7Kg zfy@8pf`-Nj|AlQA|Fmq?fptIXim(x#Q$hn5A3z;;ub{UAm40w!;0p*xQPt~m6u1*4 zG~fRH;R!m96b>aS7IJE9-?nR4o6#^XzbT`CX){A=WdX)s+j*4Jw{yysmET<5g zhm~p#fBsf^D;F0ldkaO!zc%K=&KAJy z2(D)T$~~m&D=r$MjeX8>bk+VgEg0531O;L47sQCx5<0@n!Uiwkdzo^@5myP^w&}xH>73_@ODfWks~GrQLlMjj(6T=VkhF~X=S9fNiHaa$-%?#Z1=j=+S= zuh=Bar9-re^IBgu-N?L&pE2gF)wsS4Hk}wSgKhO1FhZhMJ$QNnak zc_Wg5E#j$$od&Rmk2X^SPW82|hAD%CQdfv%199y+R!Md+Y%xnNa!ceFR9YkOTTG2X z@degv0a@FP( zQGp(nd6$`yUEyu9VQY|1p^_;z5irnE5((Xij0zXIU3O6hr|mv*nf6@YKau^_`vx?U zVzk*ma1d%XK^Zsn6?b(_#C5Y>sgU1np+JAL$q#%lcx_5fq7N~y8$%Y1b@+qlZD)GRtqHiH64d1`M|6%gSI z7E)Ka;0tb#V2V7kP2N5ve8?RHqQI+D^S;>(^p{w&^T-`9T8M^17^E zj64Ug&h1ngxbO5^%8Q*oM^ZU3ix>(+wxqIv#20;@gRteOC|}HiWCLR4chOZ?sIl#j z?HWCs7ES&pYvD@XBAlD2DNS!N?o{H^RV<{m-)}D?NnIgZpCH&_k7h&2!m5!?4~$ha zLL0|~NL2^L;1mhwQu-$|4NgN=T`D#77(jGn_Ram-(H2Uz$; zf+hAb__g8npk=#_HZo1EbdbJvfPcy%j6v0c(TuA~CFWa#IpQ8DxrpD2g$oi(I2o2Z z24*~d>3T%gvGu;W0(7PE2QwGulFsU`yBy^a*R}SEcuz4PGa`L2Shn)X|0CKj$vi!l zaCDGyggSmFjrM}3;YC5#vSN>etg=m3CX&S4Axc2$Ts^+a@NfA#fKQutd*pd^(A_V@omWc_Wn z2hQwncEE}pKwi7qKc@PBPVuRUGcsVzXrYR)ti`QuI(D>YgTN!EudAs+5kX8H4W)0c zIAw{MVl1p@Hk~vb*I#_7n5AXW>4UVl4)eC&0I0WrZeAgG;bu@^)>w=-#R1~M{oE%( z<@`afh5m|!m6*!N-#^rxklo|Mz(ZxZ&B4|4VcoMwNXsBy(X2|3rvfBIt2!o5jEQrv zLw1MLY3@bD$B^%WBD~XC;wrIl$3tP7Ga~QLxD64h(~D$xN9m+3Eh~TMA+@A?zLmjI z$OvS($*mc z>-7O^ek3#vj<28l;F`DCy?7}nY;gV&6-Qpp;dX?e@leTJz3`e<%0*?O&k9$~VgWeC z_Ui4vn7u*k%x~Zav^W@jZEk{?&K;VrjDojuT6A9(_?togSE~qOT7HfJd3E8yiZcJJ z8A#S1STN?F)6hQ^$ln%WfR>FX+7Y_n57T6A3b3$HkU)*{tOQdR#4pkFEyP77VM4fa zF)bTL9&(VJtectZ;O8SUx)%V0c@7QlMyQSNfifr}Jxc}+MGq@Qil2{OuYA6*JNdQz z7Uu5F*?@*f!MBs_yWFd-K9{%I%aPAK|1Uzk+o_EZ9(4ue#Kov4D00}uS~1eMw_XOe z26zT~Ws1^Rh$bR~$k?m96>tz9%=e*8eOiHxdsA|*?Q;7+1~xE5egC=U=gHTn_#;&3_e5qQ+jz( z#pK^U8DYooTFAZK!MuY$$v%@;d#Mf91Ko0^ni3nW;{Y4nNn%=+D(z|A1>5cFT8s;)$qzErjML0 ziD7u7Hr$LASvu{+u9@x_)!~Z@iA6lGvb93@ox@E}w&Xc2)i=D=sh0f+Cvrt#$my5u zNC303wf!W;06T1)$Lm{&d0Y$R)1|S~WyRi7i~gVEJ_xzqMJD)m*o@XwEOICXt`la4cZ3VE78XZw0i9+>*DdZq@D`>yv7e({AvkT zkND$hT?3sR$7&DkeK`u(N14p@CQx#T*#3>0o^v-hT^IV<8ki~k{hDQ=f{o2MNPL zvoYAK@+7+xM*b3hZU-Nmf#%Wt(5PKm=5e#$TEJg!(OX`=TvDG=Tg2WG`EU|Ac*5tY z85?if*_GzFqJ~gBzz)m>lvTx(1B$UZ+(cZKO6+2Bo%rjvjn=Jgk(cRF6ll4EcW62w zIB7jGL}6x)r3O>_+lm-=Y`752QuDc8j|%+N(1)967Rg$7UWvkJG6uMzn_*^66b4*8 zB?j+c4Em#C{Kf`OH?n0qAeXHrx{4J}+xkpj826q~{uJ!Sp9c%>iNsxf+$vwQbbriw ziVukQ&@}iFkJP0kM*QY@SOY8Ws@i3L4^3Z%;3!$fj>B0^ZX+PgA6_;m`3_bu<*7QL zOZRT~u0FT}zGR$QwTrTi-0=wZXdM_w-WG>fwhZAoGj%2mDnDgKbYF(a=o{Fz-^*gj zwzOeIUv7)FSh489crAf{uB+vCZ;S5vy$Yt+fsU^*oAk1xygJ<=eG5BmUWczQfVVcx zAQy^X0uUL(p6C^S+L#7s!HM}|hC1}4ynle4i}drxpbCt(MN7^jC+l&R!+M=xb|n=X z1jf^Ouk_Xc9|v~A>R0)F8)zKkpO&Loh-m(PwZ1qf%wJnQY>+H*#vE8NEs3vT?}hFr z6cxV&Qqi{>kYkYUEsvNiVlfhZ=*&hcj<2^wA+xtF?0iN2RGh~5Z(jDwqHH?_EQL)! z63nv=^p9CAjFTguG~%8f$>GQYv4*SxiY!~i*;ix1?P+pn6s3MH0|SnU=3ORVK8nz} z6$#yIU7NL4`_Y{Bl02XZ7RIqTH#BItO&v$-W^XBo`_< zp;G;l+!qwLoy9y$h^PitL!U|q2HzHJ_k67`3tq0i2gx>cHzkFm$2W&qVDh|>T@Z*- z8wHeE9-zq-8AF!-x~s$f*t5rM;F5bByGh54r^&yPhggy z!rZr6i;^ia)kRBidKTcwqxnG7*JoIDr!?Y{$1{S7R)NY#4k^RKS6X2CER#1qPHoZS zNgXYiv-gACuEa9{Pg()P?0j5$$xQpyySA%fRpa^(9>=Q==fjIFVbM=F9Ky$dxln}? z2R}0&P)+o>emVfEceeQrvWBjB|8kIdz0E6bcDb_4*@yp&u{C2sa6yvG8ece%%-E~c z5L*$Q9ZqZ_1);e}P?>NK{hvNJ3_EQYjuP~ir#tzGx`U;+Pco%E#6dSS$Ou?1QiHOZ zUa3ZZ^!DggCSrpzryEF$k!(+`p3vldJ3W;2>pah|pU77#bbl_nd!o1ebDZ5Xnu^e# z3{mYzgp)o9Aof@d!ajp(M#d8Fg8N;6Vm)hbK`KL6Nzy|#$~TcA7`HT5cJip{bAUOS z3uh4Cv|Qf&V$rVLMOtpZF3?gkg4q`irJfIlQFRR0G=hsYT>AYrtbC72;EY_GyKN7v zE;J^7@d=gq5AHdZnJ=_`IU~)Gmf}u*;HMRD*qF%e-@$u-DFi$ljK&$DX4?er(mDV4 zdz63QousPUDK09Z`Pr}jROZ2QP`!o_gTr+&3m}3+&N0ToWXdGIF~Odp`=ztsKAgXY zxEKAcU&{FTJf0+Plf$J!W>3_6j{k&vuJfs<#lOz)15&9!E{5&c^!`>85g2G2M{1-p zfu2G!kkLv^+Z|^tZ7WxZwT2>`wwXK5$c-7hA-dNxaC#qapj1lhuOQWy<6hy>U@zLp{i>v0goz%WXZfJyM zAMcRmS{A?{94u@#r(Sga6JB##GIpf(C(KEmYBHlqV4p)T8=vpJ8yfL-S}_3RLQTi2 zE+I!C{5lx?OYr^WzKnY)aZ)NsfDs>fz7UP_>3i;YQcK-*4zbgh8(3b+Tgom5;)_}L zij@)AlIK2edojLXpN*)MXmCtss`*^-f%q;wrf}uXd#L!28(5NJmVOj@>Amj zvdBz39zgT8E8&DlkCft^UXevw9xGLOq9z_{a;nr#DeIUmB*`SPGJ;LYufmmDBd6c~Z?xdA z5prm}Ot}XfA@)EW{a1m>zv?{xD_ZbBdv@yfHvc~=x>tQl1-Osr=bs=mViAHux(SV- znm~fuDBFW_@`bagNmm$R#(hd&br zS%lna?|A!i^C_p#_j2a&ePj@OM&C;GzNo1w2szUebw_|!!>W~Bq=b(^OLr_1;37?%(##A z9QqVTl#IL`v(s%~0|Vz+8R>R@70%rCf(8>+;Bolb=5|toH%qQnyJD0H;lj36f&FF- zv%vwW^W=7uE3+{tR{!;xAX|f%`?f<<3qQ4-K?b!^8McJZm&K`-oG9J-tIVR0N)v9> z{aBjsKPjhsqU_1k?ujZzgwvyp;3OIg_9-xmJ4TqE<`xH-meDprmKKT9>?BQJ_c$=4 zjMxCytYKO3UqmSxF|O>r8NQupgg$=6j<$YTZlq-vBOF9{)e1{MgD+H9X&HZ7BELnJ zD)MD({Ai*5$spJF&E#uBOCx_s%Q?Z|#xuboK2JgdNp_GN>mOv6H}Ftj3C_15fk*W6 zQ@LssLl6rPe{u%XKQemMFSN>X5k(eG3>`eO2By+`tF7K7B!hjx!dnk)yJlSR10b2O z2~BPBdu&x5k6P<_Aq3zO_HpDFn zm7Q;ii%GQB6o=RAyOL1UHO{0M8NTY_mJt1l&frMH7X;blR$2Z^D5yG9sg6FBDs+M+ z0hVhb^~MveK6(`s!kkYZt#CVp7HNWEt@Um)yU(WX70HKUY-{esU-SNNJ5ZAE6FNyi z|0@&zKZxo7HhTWK>-?ABtD)<%sDbn+1#7BN90hK8kANt^1a%7oG^Iods$EDbphQ}< zK)g|1QY}$W`*`84_XD=)zV@gTu|;*TWZLz0Sk&T`@>O)hPg28ly-Bt#IdV2{IS=6A z@q_=C(EsxlHz57S4v&|K+=M5NL(a{Rcl)#-&OG$K%yXLD5$q0nYncAVQ+9L{dMk{^ zL|8%~ZuYD)D1nW*m$anFlWw$N%u$kRCw2g-iri@h4N+D?dej@mwEFNgO*?I#-A}T& z`j{rp{;-VALQ7;U#ehw{+}H-?apebor9J#I-EkS7E@$)*rI(2Eg|V45YwoYF?N6q-{yTyLb+>FoKRhs zx~U5_mvk~*TTmNK(Va!L7;yCIocCK5tt};4p-zA$3c$EM%1K#z7s{cmSPeB?LNvCOf8`?3{m|5el48Wx=_l*sG13tpH0Nx;9;ROU zRxz`t)G=g})nwWgNEf6ix%fGhE;~$JZG6&t*Hz%HIDVFJUA0SOyU>EMSEOTLiUz^k zC@Y~I7~Bi<7$GTPNdt4apBM86LtrR3@b)Yu;$fm_>Qk{x>NAb7q8I<$tc`cMXcOkq z=tq#^b!8Bk$SYia^abWU^EVrj9YaFKR$Z6{EW^DM8xMT9Z^mi^n$J1|oFwi$(KPDe zKF)h_X&!ni(>43<-=?*Aya_Y&y1&Qq!+e84G4ArPYMgiLMbtB&Xh_S)x%C$5o~uA! z)ISR^g^3JbT~!XiS`I2O;jyKK!dI6ipD7tIT(q*{w^tTrjSd>98OR8^`1SL%DUMr1 zoty*%29FrQC84%B%?K&EpagbmC9S3#$NlcEJ9y`nDk;d!u(-pfxKAEwX6NZHKgaP1 zYB$t_?F>eqRsQr2>Uw z_(OydVzS-~dc-l>{X`EmXAFX|Rdv9?J-mu_z(Aqxv^0Ze@0{dC$IX3^)}7NO##x~+ z9M3C6>Mb5#EE{I2d$azj^w@8$olxgF)9&oV`R*{O@bEZuYX)Ni|2j$bO%CT)Xd-hQ zwM1mrelZiLpY+Xh)RzFFoN=AYS10)wSREU_e&dln{ z-QKeQ4Br0Rtp2Za%>Rd_n5v@xSMZj?<>`xC}e-2KbVN?1otV0?Gf8uQuiI;twFnF0IOGq z?peO7GocyicU|yBF~GmL;iO|tCQBMo$&+-Fe;;HxPY*S*AkpOSf(S8XHh=UVc##ea zUQaRg{R~7zJCOi?eunC3;h-z&h)|?vFybC5n!%)VF{ASnIgJ@v|1lCxIw-{#tI?R2 zR$KlKZ;d!&&ucn3VFOuYA0z&9T-#_62%0Il%L~~x-znb z^P#1s5Ls!ytkHobY|s>fX`IhDv$zgD*P2LuysS8~D;>;?tiXW96Yq(SMdt#r2AZN7nB( zY5D1c_=t}FcIrtKLhQ>N&i0f&^^xW4qbG2fc#aFXFkfGhFLpNdT4{4F9?z|eK1<@! zYJFJPZP6h}oM)-VgkP@H$qGr1{U!-8lV*r59HgUqeo))HmDcBxVN^SQ=c^=M!;7bF-Vp_D#LR%hU=jFqOXEPi{` zviQDBaVvs_Og+?TFK!#hKwRuun0>tT>GTS9P6N9v|F;E+*IB6uxeN$-&$(;!s^}B; z-_SSmBHt%-G-WN+WHD_Vnn#XuC_+S%<)Mjv>q8!SuJBCStZuSZ+@D>+QWF3)fS95C z+4FTz3MpP=#?w>~0EN%lq3aHC!_fBisQ)?c_lB#r=EUDTW&A4A0 zp*joPiR%T|ptP>8Q(b|7+UP1$b@(sFIc)BKX0JdjS9dPjmnRYt;BuzfPeLlK zOxIUiI;BB2mqZ4H`HIu3HYo0!^@?RLpD@l=q5OG-o-U6*{X?odL|e`4%dJ+x3l>+0 zYqVRBTTQwwuj445KL)KJ!f!aB^(lXK=xFbT78!!PWeYf7)Al$ZQgMZVpOIi{)`?jQ6EGt zN1Fli^1-fQ_AW6%$y~nM{){i_1&A>$M_X2zsV>$$W{(fgty9e0&XaK%Wx9|P?(RQ@ zeG?yL81E?C<W zZN5#>k7@jMrYLPHOIeH1CpOsju9{rH0jI4h`qTq_mOfmrj9}zlOFZ7zYZvFJnE758=N6laV5R<(K#1Kyo z1+WD$nO^oJbwf~l;1+i3LhT5J7^fJYLms*@D>Q~0??Wbi*eH?7ovb#<531*sBqUvH z+U9r0YMiyeOG4U{^oDtp!AW)(StJi2q)@BV3s*IOD-`=*=AY#uTmJ(1^>p@7EIoXFwrc%;%KzWnF5|D26z! z{AaY}HS?db4Dx-hI3$OpXH?G=cY?vO+%f#1#0cmsw{|TTqcs z$L7$Vd%UAhzcx=P+Mg68NA>=MlLqmJuZxP@X2f28{~GD@+LyiN#*x2$(bHArR(-uT znfv3!VgHYf0N^cm@>CR$o9t9P4L#kW7TQA!Pz27Z)<^kRut0`|$oqMS&?>DUdp73?Z9UCZntcGFK-dt^CpAZwmX=VV5T+Ypb^d`CxT@_i6szTlgx ztHgj-1grdsMplBJC`(f}U?U7w`@!%?6;+hmt2Bm_otM`4-fLydBDZ8CKnE9@vHAfX zUoP+WRBN7IyU=;_AFV#%$PL^L-qDLfLgOq&dAd2pPISue{D)>YPcvn&qPdp07-1eU zzJDfttKVorH42n3Q|=R@#KfayWiZSYWe}uptFi1wI=ahv%D{2W04pkz=4cbEtRpWX zD8LmDRE(7XP!T*dRX`z0B$_?w?IiTG$iAuQgQD*ULx_(FGl2j^*?Pb)?RU*2QuMbo zEq&RT8!jCtp>^bPXv!Co^65#Q-Q9T?rJPHk$4=06@MVVAqn~Rm-r(mRmHh48Umucd zs|mYU8p8A|L;auv@pA^4^Y&>0!1Cqe;Qp%&JNaQCa%Cgj=*fBm6^-mmiT`Q zOy(xZDh>*vh0Z~Mi}?sD4HcdDgX5sO9gr%=&=!$lJ&E$BG24a1fkA)DXi_k|fB8do zfL6u4CU!t~`74Ke=ia@{;fk>ynq<)>f_A2MBjx5jg4-*-&yS3@lJS?O*9Tl&(@{Hdun>V2VjoU!p4XJ!u z`sV`b;DAv378}(tQWIx4Ijx6h3rnBHRgtieSnJw{eu?Qv?bCJqTCvm2)7kh_@>RL# zE%Fr9705W0o4C+8Jeu%tkrhY1f)6VZJX9p%e1RJw#{M$Pv5(N0_;s~wQLeYYb@ned&te6Ox{l{(K2M7ESVja1Hb3MN5H12SzFVU&LuBa|JH>666&HxE@r?=J7)GS zR<2g=X8&^*sZ{l!fml`_x?SVMwrA~;s5Hjz(pO`mSQ%pxGHa2=r!SB>=IeIu>A=c# z{=5HQXq0iHFD2-WqV8lzQdX zpKGm1w&DoY#gCFXaYu!X#7~p8CZu^?wQ)Uhs+>J)#PBJe#i}`uWi7Ph0;s#YAz5Jw zw~`e9sp-JY!2B>YhrZ0WjIK*AfMrTq0Qy6cjwymsTqkw_Pg9>xqdU!Lpb?z0#YoJ^ zmSnyN*RguGR$M-9oW0O`yzbsk*yHGP8Q-bGzsI|JiQKmLCN~M z8*#-Cx#tXmK@Ref1SrpIQOnx39dW4^ZlAs~Z@hb&J9NHS#1U;BPiUoAwAd!c9Mj2$ z24#}W2~M5TEN!HZrU{wJ)beG8>6LyKM^9yK@zbEC3o|AQ@u=;&qX>f8xF-JY%P^=s zs8pS7oUnskDO7)cj-gy6M#OT*+zct6a5@B{(0$cU44XEFrn39Q^6T6;+xR{Rn>kr9 zQrP5C&;*oe71IpJJo7gZJ)_U>PCxolSD^3)lF2{qW?^i^sZ!ZVK`FVcQ-G%3vW?@F zb7r)Kt4A4b%}sUAO|?dOLlj*$<3+4c_y7@Goq)wK>Kl%#zS!GZDT>Lnd5SL?sxSJ* zk1i@+wA z`hcof6#rthes>nC!?`F;*Xq!oamK}gk;Q=c^O7PB8pMJK`+Q;+Rf-2^gboUJk(7(| z9ekdg0;2FXcZ%jhp(Iz=Q?;l}MNBG0p|tEo-?GGWiQnSn=wexO!QI+@!OdKAul+J5 z<^6L+ip!0SLq7M4)|vT()00}~*wCtQ|btkyWthyh~dUKeakz#nBpKn!2FunJ_|0?lFez^B?l?~^x~Im2#$gf9FHTua z1}8l|>iSq5U>Ui}f#UQ);$8!wiJM-YCKP)2#6*@>h$>*IGFdW_8OlqBK@ED7?wf@mzih}MD&(oPbMp8oa&M-Vn;!CTRO(PmSZvNd#Vsw&m>#UVlWeC z^B%U}?{rm;HZ6pDMJJ=pif6JxrhB0~MqAI_t`;X!eY~#$r=As2XuY>Exy0Cr?AUUQvr1tQBLDCBVIjO5f1?rZ~# zk(mUxN>!87(fn2tE8~r-6^nDKvi7O& zTN<-k_2v?lG+Pr4odH%FecI+yo}bR-h7pR3=LZiKW-1BS{9S6Fm-WaCRRj>rU)k8u{Jt9)P_v57J2?b z@}gr5rVKk=Ep8KcoyK^rFth^g(-DA41`fi|Nl!Mow2BglypUaG%16C zd-UKWwM_DMf(5=s?}UXyn72%-pv{0e;WbPrq6J9Curr6|pid9sc2b@~nGZ!(_gW}R zd>4#2(+JK4?j)oUQiDsG4IDG%v5xOp7}h_6`JjAN-GmoJ-4NfDjb@t4%hh%3kM$sOK}rVT+G%cLU3MeygHY~yq>H5 zXF*6%U(^`%5(K2pjha}Yh;&dL)d&@mR?T3%_i`4C09IJ%CJ_~ESs{CN3lFp<cEHYvvZxsME}pi^r~`wE zR(Zgs-l?`OOui2RwdVOqNP`MB5%Y(uCqdyuh6XYj&SY`ji&KT8yGk_s0Q+i;aM?5- zdy2{P*c_p3bO^!G;}kI3o#7$-plZ7pE(%o1`*$eB4({rt=cR}Juz3?$kt1+a8 z;q2}fG$OYb{8u2zQ0y)_IOhEnw(C5*RB+CwEeoqwZ4=qSdrSrEIj{YN4rBUoUm1NO zT&9H=c$!s`QXI^CiGQG>?ity42j7-hG3nCYnYDF*aF4$Nl0N*J-rsr?EW|$y)?eTQ z2a_^9HEZiWraH$4_S?5}E;s8VTaYVVQ1ERD?Yf^Vzlix;@9=<_kjoh4!-VxF7(uQK zLIv(V^FP@Z0kLFbm}Hg-?lE-@eHS*8U?e%r$|a%#0Z_k6BX9S^=%5-5q} zh~z!E>VCuTe}W~#+u@A;g;>DwQ@6*!D#Iinq(E1cnMcoR1$4ay6ygxOKhZ`71sEw> zJGoa|#@cGF!myuz3IL(n2d_ac)Ull+s~^G3uRU|o7<8(8p)66!W)zR&>`*4XQ~t9e zj%HD$_=pu3GpiS_FA5d=Zqhlee^l6$tTkf<{yurrMT0T<#@W>k^xkDdjEaprF($T6A#m{3NEFeK?V9UJASIzNF-3;$ZW2DJ1C4 z+60`Xih-PF4DJWLECu}lbSQ&f05tU2g!ZBzDX~SZQWz#fXiB^3r+P9xv;FrroTv=! zni^qGP0eLX5hx{6EmPGNBl^OfAvTVBS!e)CxDIej#izrN?OhdSUs4TwE}r8B55D6> zMRdgCkm#~y!4AsJI09fVghHl;r!B0#0|cnSpHf#TRU3(KQ9_m;c|^YAxJFPg6do+d zcV~ChQN{yZX~k1)4WmyRmPYW3LupYAiXhiQ93_Y~8QAfM5UJu^lIgNpU%JWgHN7ls zmq36DlRpz@a(1!d-W}9$xJmzN(}{k~nv}n`>bdFY2191lQLW$AV2&x8P!Ei+Liqi$XVbQ7&w{*$& zBHO=doIpiDJSm~dY3K#HiD;6*m2T)nhf=X>PTeJhI;iIu&I7GXoptfm;HrW%yy~^2(-j6zk z@fCK+fx#(HG}>f7O`gwf~?U2yt7x2NojM1imx}>oPJI*zX!^ugOE9eJm@Nz$D(bQ5 z9agonHaTb_)4q&ACr{}2`YDuuMA#_TpUF$Q1-FNdsn__Yh78DTE8KH7(ym_t#UbWjpCo-UXKEbpHc=OFO?@3(pH!ps znXe3cF}&h+q6u|mp8X#GIec3BaUoO)dI=O-DSMp6xE$Rd;av z>pJ!+$cC^ag+|Z`Xl2P87>7($#y&tSGI4A3E=kCo1kz*@ld*Zmo40nuLs63hgt!+< zVP&d&^)!*nR$fDWM&@16<>xA3~$dOR_D`4x?e5|#72UnM4tjLE?IvvDb>|Jd#9OqP* zw6YtaPywLJwr9UwZ?y@R(Rb#;RlZfC=aw07;)8ivdEwqd-83jsbjXO|+k`(AOkI%$ z`bnubTn#iAx58rKeIF*#Eo^Hs z2p9*oIW;U{LhUdprOLtN9Z-OjpM<XPqNMAh;5WRA{JA@-VUBE2Asuc$Qh;|2))eC{&v8byr*cob)JHUV#1(swddDYOX=T{0x@Ug9EETtB>jv5?5pBU- zAjHz08TgDn1JYD+_u!mt4_{-Vax!}|+rM=tIOFS+88_5+ z^BXQVNIs;5GoH#GCaDX2XJ({vcktV_nT~cbD*}l`xvf_UM0`+bSCmZR3Vc~HW$Znz zKKC$gOupRqOr$s!35_HL79h|Tt4(;)_|jm{=pnSAGSoNW^=%o{7I!-IiDJK!r$IF5 zGzPts^}}ne$!=@OSr@HcP(GsmjNV8jERE?3m~{agTr3{!bi&#myZuVobHV`XSrbx} z(*=o!s~OV~+v~^ZOQ>PDIdx|Q#>53NLqVK^RF?wY{9aTOfuYowXr}uE-YUnqGujt6 z7+YO;F$pqnpiDx?XVhCvlSL)L$+axX%5Ju7mlU1OIeo$M>-YJbWbf?JT8k?ug9p43 zmOn_j4iUPF;GD|d)>)#=(tH9-{jB-5rlzPRX%xa^22>@9?Fqzz+g?jh7<${~xLtB? z)@bnFv$wXYROVA4-KdwG)U5$RE$nG&1{o+zHlcU7|8r3vOV&e$uM3&`RRUB%UY;45}9WNEqN@ph8b!( zQ8Oi5($^`zUBinEFBIcIO{SV6`D#$`G>|2ajnV2}f{!g|xiq#?%R{=x@pO*sxa?B| ztR)sIlDLqA$_P?m!5m7!CJ8rxlw6&LhC?&O6Hh%BPL)nvLMoFZKEH=}a%mqheg~bj zLK46)Jm&G7QoXPqBy?rX!!2!R%=t#^mT-3bsxfkTP5b=WinPF{>TdrR?ymvzeln=b zh`IWl)VgA`Aj#y0_9S;qZg4GZlIc)JNUaPvQG^(xui-MI;A$iJ$g0Nr_Wc17S#S^YWjl3PusxQ!)wU8b8 zFDF#aeJM!o$?`DADxMHNAZEJ~37%z9K|H`EELfXxd1kk~1D^+fVfB^vE8gX{gus(q zP8#n>$2_-_?mAGc;a!1_r%;Q5A2Rl`D|Ws8XM%2#K&mA6>S3ZSgN+PlDTfZgC=(ls zm&A@kk;cmfW89r0B}hsr6~eFYifW50>0>}L`!=SQWrUPCV>cIK&lak8qFzeUO^%DK zb;G1evX6LifZX+YX)KcE8#6f0K%rmfZCvGrDbX}1=o|~8K3Rr?$7h&k1ziysH@RgY z{wk6x@9k^JpF6y3O+|Vy=g#O%A7KZ_!Z*svG$;09pWmGH?5PE+@IJ+K63A3G zRxQj3C%h%n3+a83X?IpT9C|j9f%VX-U^n`S?1AX(xE>Rd2=n1Z;Z)gMjS=KX0e`3S z7wBro{K8hVEJ`ZaJaVVTROdCtB#>bNW}5@N=l7*#o*|`}5%^--4HcpKSh-7)JenNy zz(_n1cZ_*HlPkY|<1wAGFAe^ejgC#2M~>K80Zsz*A97m>&%{gwf-fO!IGXHtLFPaB z-&53Z_*)T-ofB9e3q0E0{0fPG;tkNTN)22HXZaVdDl#DeP*32mFbMm<{8nWN|B0FI zf2hYh*oDNS3i$x%CkPjxlN-XM-~l}-islg7!sKjDFkQ~(EOz?zTHAvpR5~}5r~}D} zx4z^}Rg52#tlI~!tHl+ron`xltoF9AATRpDATcI!tCII9rBskRRh8cTef438rEkUHMhEA+zg*XY08C@c<&hLhWA^8_Fv^SZM)W~Il7h@#hDRC z;D_T-kWj22P#@^WwO4$^dx9mjFu=&H?b^FyH@T(Ly$Bt!!KMOW$9bv6YG|h&2M^YU zCGxhRi*YJ(LBW(c8<*WZ+Pz2mS#CJ})k@Uo4>!wACtr&wu2dnN-KP`r83?6%l_42R z3D%P12Dd6P;xiy_Xjq=(8^QS3tyzaReeH-TW18P$VF-W!G`Ph>d-x4eY8ZLYmgp_Z zN$pPinOpkuoSq_cpCbmxXSF`rphklW;_gG+x-7lZ>m?x$PFGc&f+o51$}<}B8zzt4 z>4S$Hz4fx|ian>^e7yJc2lsNsE(y&Gmn1~KG}7n2?}h6gDi5h+Z?gyZpALhVB1tKl zyx+4x3bXPMGD}i|@INOM4O5vJ>)#(s4g~!uzHm&n4vs91I=ssj8Ux)V`sV!QOCp|9 z_)YS~Fs67!5t8AeXr`cQlns=!>|H7kiQC2;Z*ghB+|?dPB@U>Ja>Z)GbHAgb_$sMgr~G)JhY{!TEY52na@|#S?S|HmaH06E?59!Gbui(%>6w`R-#h5uMX! z0J{rT_9=QD=D~G4vDNy`P7OnhnumO|Y1EcXWM(=djE1uos--9OP5}>zC!E4gpZ6C( zuD8)|P^CaSANdHayg=YFqVm{k>Z;)4g$6&;Fwb16N#(cZ>?-D|Q$Ew6KV~-!=U7Av zc*Pk>`6Q(P`qiA!!dlj>Yxr#hrp(uX0^y1cbC&^-pjoU5SN^QxRI$TJKUQT^OdMFO zPA2$MH*IjCoTeJVPa3DO`**Oi)^2xR+ATF(WBu+l?`1+>>tS=-VaII8yrzTK*C{e_ zDK)^Mg-2V;&pKI<6S?Nj)K%_Bc+ONA_WB@s;!}K%9rZqZA28~b$32&j`F*+oi`%dm zm(`mzf;~jxBz~Y%;XJ4j-}z{o22D(mZ_g%+g5vo1aLV+J7s4Zz$Rv2aRq=+G7Y??8rDt!e1iy& z)&NN*U#B+|7pcEFX(?*S{}x+~sr_k;458jCT!EMH0>8L)kbk^!4L-?NjJOB(piv7C zo;6lt^LKi^A}3RkE{r$mxtW+{b_}M3LMM<>S)i0Wx*}mC5~~QY5?whdTa5-ih)t`h zerXv`DOtuC2}T6FBT{|Ot#W)CV!A9B_w>Zqn^H`TlVwXLnBLQ9_T)9iVlN%@X^G)- zmP+cbr6;F!2gQm)O=+EcU{cTlHh>V(2mh1uE%#RkaF$v!s##wN?hzfce2EP! z^VPf7wJtvzpICd}rF&j)RJ`(rvVjng(NWe)8b0JPO|bK*)vOO2Y;VeV19|}&w>9@ zA2~5HcZe}|+`+L`Ww2!1ll&Eh6tMw%{O3e{Gmm9d*vm`+lhy}p0JRQtg1&kr){q8o zLcN6|^;}wkg0ifpVwusKmkQ^k9L*NHP-IFY;N5Ccd@9_FZ|75USR#U-rg&}%h9+UO zqJNk#C`giY?8LjC5LY*DcR_PR!90NpCku;h)jY;Y5l+yID$8tEr}DajdRla|C!JZ9jS7ZNR?01x z(29C1wdrL=YOxVlG-&JGxru#`LvRr*x#&9t!iYKezI~KPJOY0uOXC!x^tjzoC!+N3 z{nNF^nX*)eZU>pfhV}$EAxl#9Qv@T9k_3ldr>eURyt9vm3j@@h<(CKp9~)y4yxE9;sUsj8c(7knL%j`1o#`5%Ch&^Sez!sOEPdI&6 zVDw&BqsIW}LMCTJ0HjFlnA&Wa9t9CkDK zXj`8X!ztT=v=f|BhhEyJey-fUg*2Mzmw1dvGsk1nDft>e$HrwSAlXa1HpdRnYj;#G zFAKPvbfbS-by>00KuvT{tAU}ryQZXM^I6aXWk~r!SM*_jo%ySU?%sRWqRO$7btT1h z66E7j5S)>9RjUTgF2?NIVycAJas+~Dw$;R!gXH%!)4&kKZlqnk=?tkW#kscq+yboW z+rDQal~@?2_heHhcafFu&RM;HvEow^*-ICyJ%;E*c@nCl&L(6RdZ}o1F*QZG!QBbI>Sga6MhY zJtASBj*zP)0>ULKMME%=^Q|Ms0&OsoOrGh&Ur|9MWn9}GUE7^opMeEm;Hx)FpK6=$ z_{v~P*=6*BN?ENw4Q@|+L;X1+8)Zi~fzB>%!h`h^bpruB>*Bp-oO;obx^UH&dKbO$ z(q8}M=W`~0+uJFDUkz7WMhiv@aBe0B&dqec8?N7iGXK8YB2rQFKhh#~_4G%i`C8~g zR9HFmLt$7gFG|3fNKAY3ApNaHc+`WwP0I8r-mo7i+OD%hrK3eXflK-y4xi>e$|6?A{B10 zD#AtKv}EPe(^Pt9YGbX4`+_lK8F{KDoVv&%CLAH+g@SXJvA)2b~P z>boypUaQ}6JuuS^2rJSMnz?|-^5S+$xt5PJ^Nq8*`Z&O7bQv`9F3GXQpNe)XQkz^p z^tlEZ8Mr6Sz70+qeI0ZhLc0vns#%y2L@V)bnd_D~!9l`QSKA-FOWT~a)${p8 z+TfUfuJ7Qp31=TU6nIiOcQdZCB3(X$(~<*+*oXDli+H*V(s*JYkt(*HH9Gn}#lFCK`}qFL#aAdF*HX&p9s~sLs?VmvZ?e*GDVXv}phS9WATfZe zCv0Slh59;TF(m5tX|l&tGKmJv5lLF(RIK0?3xFJeW?;XT3&8UX36MatEl}Tbs72&} zRjy4%<~CwS_wcN{yU50+!K1t@+oH+QjGY{erwlNSF7Gm3Fz{lq%(l5Jko+t0+W{vW z<|v)p!~=_#ZPFLCcZ-EBZAY91b2W`SDFK>@N6ZUZq4(xZgDWbsp98!@^srNCj!sou zbnOcjsP4M#a7!8s;T4|YR;^`{MfNy4Y3+m%yOw^u`?}l3!@pdh;-r}iuu}i*!pyg; zUX=Ybu;z8O+89#^3%8YlQg7~Sa=H?=@poZtL4hx}B8}Uq>*&^Qwp7?8S>UhWWNLZf zStvJnd5Lh7mye_o=WBZvN25s|7>tY73Bj-_x>b32R&1Sh^7j=AQ_eI-&RY(<@U<61(X_-G^BC@j6ZrN%T3o%&$Ta80FN_$+ds*mg z4Bl+7KLj8820g-KM9N!88(EefeLyXEr}f1E>FQgJV$ad{#7w~3$WkRnHjdjU+s z@8GxI1|5oJe8gu!J%r%-m&`dt~ z8U?WpmRwOb!9-7yLjq=~7tZ;VEK{yu_+COu9zvF1zI#(71z8uuskuKv@8l5fYXv^L zz_!sKI77Te=J{%r7KM8lznuCrZJbCZGE5c3daD@b-nI3whMy8#5*`N_wP*az8S%T} z|67FDqaeLV1zDMHL1a&04E9t-G35tRR#@>0S!ziIbWm8B<@&uQ3n`AOrTBYxqb{{P3i5k_Xu+7pGy6q}2>-lt{55ZSh?$Q8V533IZ8e z)AAPOU+%Rt@$JMZu%|Jx!Q{_3Rv!@LvA30H^aZ1fEvRDXhrTq~?Qo|&hqP@s<1Nj2 z8NbE7CeK`Zi$&fz?gpc^Qmz&-d^DO?5pe7c*EQm_?vHsBL0kP%DNWEs*D;k|7>z#d z=wqqTDLXzMTjeXI#Z>8j6+|1g9`jA;{$BUbP`~!C$T;TqJ}@HE1NcSouVn0mjR4km zM&hP+_6~}U`rrHiudm-;6-z~6G7~SWDjVBs6G?=Gx;aUIK^PBaUs4kAs7XX+*cG0V2~ddK#KcXI~0Ehk(PZ!Zia~Iclre z2g#qn6e9aNJp#Fo^D}-u&h633g_}c=9-Xm9f>Q5G=Ms%#t!YK|Y8A!ErF1KkdgYRG zbsS*^;3fhFrc!yg?pG3=+e_?P0JAiqq10yFZXCTivnlCRM+ti6LDZoXquQo2jizLd z$k^;*WS#Njw8XjsO~>XjDmG7MD!iZ^^^e6G73Sb+XJj}>`yq0;R78T!A(O6{K|+&M zbHzqGL?4?>Z9GO9H(xKQ)tJOpWDG8XT|luZD@RHf>uNSB3_55Ov=ljCQy_Xx7enuH ze;Kc5A>a+&L|lYO-A0mCY=yMqA~cJmS&6XKVsA`_m+*Z8kF+99<614pv$yTe{4}-3 z1b~yqt4#IQ$kj@ev6tR?MtCvcQNwIbUA z!;4kuj~H{_U;^a5I`?#33lH9fZunudyVD4_>d>guC)K*~adU_y9lS)kavh4CuDmeY zPrQ{x{~!WMV~8;VXqc0m9En$TUyy}@--hr%)xkcriO%#D*}tEYO{jn2HgE1wkqY_B zSQsPyWpzO;-I=z_GLKG?N-d)EN80tTXOKp78?&olk*?c&WYc?SNzb!kCwU?u{Bv6- z2avMfUY=jMMFBWWj|+7|d%Xi0Fy#+BA6P~_U9#pU^&_=Kh%|+LwELk9@e0_w4B|by zaTIFF@wz1%=FV?9Ajc$H>yV1Dodg-LD6w-it5zgtvTlzMgKb3#R7iCcy33OlRFoKAEQIE;yRz}PME$62;E1Bs8Wu2 z$3`~C&1~Vn9L^PdZ z33{h&m3EtM%nU{*tO?j|CYgN}V~4?UnTTf_20QLrwjNr&!BZ8{PR4s&9+`9s`~Bpn zS~`O1I=$5UDEK}u&x}b3yWtwd8W=CKr1(8#zjDNWA^O#Z#DVane2c990<_UwzuRa< zS9=E|%YWlj$cP=5?iNH3`Y=~wSz9+_HZ8WuCX6Q96NnX!iS?4<#hzCx;baUM8pWjW zvb3rn98pIwDy1oMkx-9%I?LIIhmrKg7Vnm}Cml~Ll8BKaNiEQG)B{F9Eikghh`on+ zDL%j$&fi80)(!VdX3rZFEd8qsA)NQ<`4s)1i>B33S;BQuw>+VM(+vPt`H6QJyj@l;B#6*A|Sezu|o?d)gbzUWi2?e>*W zToiD2)QPw&zook6cb8t$CH{hz!)qy@4sh5G3|M^kBB#VHCS)$< zfjGZ}yA4_-2}yHFFfu&`Rb<5xvTet~?^JCdr#yO7xo~13pi9kTui2t#cUN%}BDPZJ zBr{xQ?OOPCx=tQ1ml=l~j5=H? zXt+&1;);Q`jM)zp_OP2u13X+cV`M%rN*IE;O%5#ava-;MAJAkg-8%zu8&3FIuOm~E z6RoI_;MDz;z0ue&HD%%4T@T-whr@q!s3-(ow@f_L(#(B<8?X!6F^4BLDc(jlf_kfzXp@Daq@}O$vpcE`Z zOprA1o(s;W8=33^s4ob%XEhnqnBI${#&-0~;~x8B+Ylh>uLe_zym~D$dzkueR^k)qj?i{>RJ4!OO`P$oF!Z(0Na!A$oZ9jk4)$AW$k@ zsFk0+q*4_|yWUfVko^Ac)hMNGpt+1R#KgsN=QE&Yts2Nw4g zf#f>$@4|ta(=M^M#a&}v5NDcrv|*=8I)iaNSrgTEUQ+BzZ49t{i`qeTJ?4r`6v}UO z0d*>2(eM)y1=Qlq3|O$R>XDqc*qn&L>*oL@`Y0(`S2B3nrbH&A?&sF2#pN)P%r)~Z zo*2}!U2Y%KG~!lYKNO2}#)M~Y8P3#=H;;`SWCPw1RYvB-jaxGO+7D@}tU>Qxf zwOXQKeTsepe_;H1Eu%YJy?4zGYfC1A!5`jNW0WZb$8&gqCXS{e`89LelT1Pwuk^T8 zkrE#XR0<|?U5zeyLKX)uBY(a3<1xnbO$FBG{qcgv- zbcA@3bg-F81b;J2{c|>=lsJx?DNfRC#8GMr5&6An$%;~Hb^8a4BFPTW$l|9ttpZjp z=|Vh-qbV9`&UFO}s@oEP`1`(2bmVpw0dGFTr&Zg`ftxB_%F7qr!c9#|=qwx-ptY z#J~DLx`a^pWv$+V%3ss&YhC-^-rQ$>IuTMsj42=)a2ju@hO$jrIO=T1hmDimUr}X0 z!f#mL@j2wu_y|{1Z3I3?JDid2Iqu5?qb0%7*x88J(@3>T1=;{pANA%OQ~SB1$(KCc z-uH+Gq0vkDB-zOVX&Yk5Ybqnd5 z6{OV1e&TJ`i%i*?w5$C|LIWO+5DO4mz`OqH*QZi5c2-jYXynC!ClT=co&^B7)&2h? z13=A-KV$&d`bGEu2`D-kFi$u%GzdO$(>;**zq0p0^YHyZ200S?_ET0&Nr+xbP8_&X z|JPz&pmmGibc>XLC;GSl{C?#5e*0YfZ!uXRIVo{5MWtu5;*Sx&6#!0k|2cru-S-0- zE8h zKm$d8EgbEE8_UE^EsTT=42c7XPc_ z`L2vjD!__^0DI?~$@p>9_}*ds5&gNf@&D|FQM-dM3}B#%6|l|U_C@_TYJ6V&%)x*XiFW>LwkUonE*6Q zzuqTahCiYSTU$GP%e!GCt7mEjbh`e`w()ofbczuVi2(0WE#_Z26ModS##e^*kI>(T zfS8Msf#ZMW(;uS-;O3Q70a1m49Z2&7@;}X=;{PM+Uk}B1>~EF+b4NVRaQg$g#&=Ze zkGS8v^?#Y4$0-hf;t{;~Bi=8!{(mJreB2w4)93wUp?vvAmj7*W{**Q6C!Dv&e`n9{ z2KbLN=-=!2O>gFL(wm=vD4PE}17FHlHU&C$p3zPo5#?#ere@54V%Y>A7_#I zQM|@iW2al;9OU?hJdTaDgRR2SG{xSSx&Get}{Ko$T z|NTzkB1KdE%B{{_`wo%Vlq*JJ(4pCo>E|AOS7)hr*k=&{`2PqGfje&+o?LU+wvS%=vh)_D{~E(EpqB&*tiJQ0-65Stm4}a^s|D!>Voy|XKl52jW`5Wx_2K{yU2iy19>-ZD@r0!qf|8F1U pzbL-0C3_3~ zRZ#mYf6f1oqJoH`jHHCB8l!^by~4z}yc`4LEP@;Z?bO6{g9`Hk+s@(L1jC5Tq{1Yf z4E;CQvrx0-gF+peRxFC*gF=&$zNYjO?K|gN=WqXMz`tYs@0o%B{dRD+{C_6(f9t^g zhmNJQv6-#;f2)f2uc{u-#*U8W&i{|ewYN^n_1~cv|1J!}zc&$eaBy{T{cEpa46s*q zHFkD2cV;xTHFj}{*3kBt*FgS4A5SI|$F%$gB@It9FlC}D3y`sbZG{2P6gGwC$U`6O zb_cId9AhQl#A<&=x>-xDD%=Ppt$;y71@Lwsl{x943#T@8*?cbR<~d`@@}4V${+r$jICUIOzgZJy_9I zu*eA(F)$~J07zX%tmQN}1^wj+RM|9bbwhQA=xrPE*{vB_P!pPYT5{Or^m*;Qz#@Bl zRywCG_RDyM6bf~=xn}FtiFAw|rrUxa1+z^H`j6e|GwKDuq}P)z&@J>MEhsVBvnF|O zOEm)dADU1wi8~mX(j_8`DwMT_OUAnjbWYer;P*^Uku_qMu3}qJU zTAkza-K9aj&wcsGuhQ>RQoD?gz~L8RwCHOZDzhBD$az*$TQ3!uygnx_rsXG`#_x5t zn*lb(%JI3%G^MpYp-Y(KI4@_!&kBRa3q z|Fzn&3R%ZsoMNEn4pN3-BSw2S_{IB8RzRv(eQ1X zyBQZHJ<(~PfUZ~EoI!Aj`9k<+Cy z2DtI<+9sXQu!6&-Sk4SW3oz}?Q~mFvy(urUy<)x!KQ>#7yIPC)(ORhKl7k)4eSy~} z7#H3KG<|lt68$tk^`=yjev%^usOfpQ#+Tqyx|b#dVA(>fPlGuS@9ydo z!Cs#hse9nUETfGX-7lg;F>9)+ml@M8OO^q|W~NiysX2N|2dH>qj%NM`=*d3GvES_# zyLEHw&1Fx<-dYxCQbk_wk^CI?W44%Q9!!9aJKZW-bGVhK?N;q`+Cgc*WqyXcxZ%U5QXKu!Xn)u_dxeQ z;uw9Vysk!3OFzUmVoe)qt3ifPin0h25TU zrG*03L~0|aaBg7^YPEW^Yq3>mSNQgk-o^CEH?wXZ^QiPiuH}jGk;75PUMNquJjm$3 zLcXN*uDRf$Jukqg3;046b;3s8zkxa_6yAlG{+7{81O3w96i_A$KcJhD&+oz1<>?lun#C3+X0q zO4JxN{qZ!e#FCl@e_3G?0I^$CX6e$cy7$BL#4<`AA)Lw+k`^15pmb-447~5lkSMZ` z>Ce|adKhb-F%yy!vx>yQbXFgHyl(an=x^zi(!-~|k;G1=E(e@JgqbAF{;nv`3i)oi zDeT*Q+Mp{+NkURoabYb9@#Bi5FMQnBFEU?H{~9c;g3K%m{+^hNe}(MdpPb?j9`?2l z#%AO!|2QxGq7-2Jn2|%atvGb(+?j&lmP509i5y87`9*BSY++<%%DXb)kaqG0(4Eft zj|2!Od~2TfVTi^0dazAIeVe&b#{J4DjN6;4W;M{yWj7#+oLhJyqeRaO;>?%mX>Ec{Mp~;`bo}p;`)@5dA8fNQ38FyMf;wUPOdZS{U*8SN6xa z-kq3>*Zos!2`FMA7qjhw-`^3ci%c91Lh`;h{qX1r;x1}eW2hYaE*3lTk4GwenoxQ1kHt1Lw!*N8Z%DdZSGg5~Bw}+L!1#d$u+S=Bzo7gi zqGsBV29i)Jw(vix>De)H&PC; z-t2OX_ak#~eSJ?Xq=q9A#0oaP*dO7*MqV;dJv|aUG00UX=cIhdaet|YEIhv6AUuyM zH1h7fK9-AV)k8sr#POIhl+?Z^r?wI^GE)ZI=H!WR<|UI(3_YUaD#TYV$Fxd015^mT zpy&#-IK>ahfBlJm-J(n(A%cKV;)8&Y{P!E|AHPtRHk=XqvYUX?+9po4B$0-6t74UUef${01V{QLEE8gzw* z5nFnvJ|T4dlRiW9;Ed_yB{R@)fC=zo4hCtD?TPW*WJmMXYxN_&@YQYg zBQ$XRHa&EE;YJrS{bn7q?}Y&DH*h;){5MmE(9A6aSU|W?{3Ox%5fHLFScv7O-txuRbPG1KQtI`Oay=IcEG=+hPhlnYC;`wSHeo|XGio0aTS6&W($E$ z?N&?TK*l8;Y^-xPl-WVZwrfdiQv10KdsAb9u-*1co*0-Z(h#H)k{Vc5CT!708cs%sExvPC+7-^UY~jTfFq=cj z!Dmy<+NtKp&}}$}rD{l?%MwHdpE(cPCd;-QFPk1`E5EVNY2i6E`;^aBlx4}h*l42z zpY#2cYzC1l6EDrOY*ccb%kP;k8LHE3tP>l3iK?XZ%FI<3666yPw1rM%>eCgnv^JS_ zK7c~;g7yXt9fz@(49}Dj7VO%+P!eEm& z;z8UXs%NsQ%@2S5nve)@;yT^61BpVlc}=+i6{ZZ9r7<({yUYqe==9*Z+HguP3`sA& z{`inI4G)eLieUQ*pH9M@)u7yVnWTQva;|xq&-B<>MoP(|xP(HqeCk1&h>DHNLT>Zi zQ$uH%s6GoPAi0~)sC;`;ngsk+StYL9NFzhFEoT&Hzfma1f|tEnL0 zMWdX4(@Y*?*tM2@H<#^_l}BC&;PYJl%~E#veQ61{wG6!~nyop<^e)scV5#VkGjYc2 z$u)AW-NmMm%T7WschOnQ!Hbbw&?`oMZrJ&%dVlN3VNra1d0TKfbOz{dHfrCmJ2Jj= zS#Gr}JQcVD?S9X!u|oQ7LZ+qcq{$40 ziG5=X^+WqeqxU00YuftU7o;db=K+Tq!y^daCZgQ)O=M} zK>j*<3oxs=Rcr&W2h%w?0Cn3);~vqG>JO_tTOzuom^g&^vzlEjkx>Sv!@NNX%_C!v zaMpB>%yVb}&ND9b*O>?HxQ$5-%@xMGe4XKjWh7X>CYoRI2^JIwi&3Q5UM)?G^k8;8 zmY$u;(KjZx>vb3fe2zgD7V;T2_|1KZQW$Yq%y5Ioxmna9#xktcgVitv7Sb3SlLd6D zfmBM9Vs4rt1s0M}c_&%iP5O{Dnyp|g1(cLYz^qLqTfN6`+o}59Zlu%~oR3Q3?{Bnr zkx+wTpeag^G12fb_%SghFcl|p2~<)Av?Agumf@v7y-)ecVs`US=q~=QG%(_RTsqQi z%B&JdbOBOmoywgDW|DKR5>l$1^FPhxsBrja<&}*pfvE|5dQ7j-wV|ur%QUCRCzBR3q*X`05O3U@?#$<>@e+Zh&Z&`KfuM!0XL& zI$gc@ZpM4o>d&5)mg7+-Mmp98K^b*28(|Ew8kW}XEV7k^vnX-$onm9OtaO@NU9a|as7iA%5Wrw9*%UtJYacltplA5}gx^YQM` zVkn`TIw~avq)mIQO0F0xg)w$c)=8~6Jl|gdqnO6<5XD)&e7z7ypd3HOIR+ss0ikSVrWar?548HFQ*+hC)NPCq*;cG#B$7 z!n?{e9`&Nh-y}v=nK&PR>PFdut*q&i81Id`Z<0vXUPEbbJ|<~_D!)DJMqSF~ly$tN zygoa)um~xdYT<7%%m!K8+V(&%83{758b0}`b&=`))Tuv_)OL6pf=XOdFk&Mfx9y{! z6nL>V?t=#eFfM$GgGT8DgbGRCF@0ZcWaNs_#yl+6&sK~(JFwJmN-aHX{#Xkpmg;!} zgNyYYrtZdLzW1tN#QZAh!z5>h|At3m+ryJ-DFl%V>w?cmVTxt^DsCi1ZwPaCe*D{) z?#AZV6Debz{*D#C2>44Czy^yT3y92AYDcIXtZrK{L-XacVl$4i=X2|K=Fy5vAzhk{ zu3qG=qSb_YYh^HirWf~n!_Hn;TwV8FU9H8+=BO)XVFV`nt)b>5yACVr!b98QlLOBDY=^KS<*m9@_h3;64VhBQzb_QI)gbM zSDto2i*iFrvxSmAIrePB3i`Ib>LdM8wXq8(R{-)P6DjUi{2;?}9S7l7bND4w%L2!; zUh~sJ(?Yp}o!q6)2CwG*mgUUWlZ;xJZo`U`tiqa)H4j>QVC_dE7ha0)nP5mWGB268 zn~MVG<#fP#R%F=Ic@(&Va4dMk$ysM$^Avr1&hS!p=-7F>UMzd(M^N9Ijb|364}qcj zcIIh7suk$fQE3?Z^W4XKIPh~|+3(@{8*dSo&+Kr(J4^VtC{z*_{2}ld<`+mDE2)S| zQ}G#Q0@ffZCw!%ZGc@kNoMIdQ?1db%N1O0{IPPesUHI;(h8I}ETudk5ESK#boZgln z(0kvE`&6z1xH!s&={%wQe;{^&5e@N0s7IqR?L*x%iXM_czI5R1aU?!bA7)#c4UN2u zc_LZU+@elD5iZ=4*X&8%7~mA;SA$SJ-8q^tL6y)d150iM)!-ry@TI<=cnS#$kJAS# zq%eK**T*Wi2OlJ#w+d_}4=VN^A%1O+{?`BK00wkm)g8;u?vM;RR+F1G?}({ENT3i= zQsjJkp-dmJ&3-jMNo)wrz0!g*1z!V7D(StmL(A}gr^H-CZ~G9u?*Uhcx|x7rb`v^X z9~QGx;wdF4VcxCmEBp$F#sms@MR?CF67)rlpMxvwhEZLgp2?wQq|ci#rLtrYRV~iR zN?UrkDDTu114&d~Utjcyh#tXE_1x%!dY?G>qb81pWWH)Ku@Kxbnq0=zL#x@sCB(gs zm}COI(!{6-XO5li0>1n}Wz?w7AT-Sp+=NQ1aV@fM$`PGZjs*L+H^EW&s!XafStI!S zzgdntht=*p#R*o8-ZiSb5zf6z?TZr$^BtmIfGAGK;cdg=EyEG)fc*E<*T=#a?l=R5 zv#J;6C(umoSfc)W*EODW4z6czg3tXIm?x8{+8i^b;$|w~k)KLhJQnNW7kWXcR^sol z1GYOp?)a+}9Dg*nJ4fy*_riThdkbHO37^csfZRGN;CvQOtRacu6uoh^gg%_oEZKDd z?X_k67s$`|Q&huidfEonytrq!wOg07H&z@`&BU6D114p!rtT2|iukF}>k?71-3Hk< zs6yvmsMRO%KBQ44X4_FEYW~$yx@Y9tKrQ|rC1%W$6w}-9!2%4Zk%NycTzCB=nb)r6*92_Dg+c0;a%l1 zsJ$X)iyYR2iSh|%pIzYV1OUWER&np{w1+RXb~ zMUMRymjAw*{M)UtbT)T!kq5ZAn%n=gq3ssk3mYViE^$paZ;c^7{vXDJ`)q<}QKd2?{r9`X3mpZ{AW^UaRe2^wWxIZ$tuyKzp#!X-hXkHwfD zj@2tA--vFi3o_6B?|I%uwD~emwn0a z+?2Lc1xs(`H{Xu>IHXpz=@-84uw%dNV;{|c&ub|nFz(=W-t4|MME(dE4tZQi?0CE|4_?O_dyZj1)r zBcqB8I^Lt*#)ABdw#yq{OtNgf240Jvjm8^zdSf40 z;H)cp*rj>WhGSy|RC5A@mwnmQ`y4{O*SJ&S@UFbvLWyPdh)QnM=(+m3p;0&$^ysbZ zJt!ZkNQ%3hOY*sF2_~-*`aP|3Jq7_<18PX*MEUH*)t{eIx%#ibC|d&^L5FwoBN}Oe z?!)9RS@Zz%X1mqpHgym75{_BM4g)k1!L{$r4(2kL<#Oh$Ei7koqoccI3(MN1+6cDJ zp=xQhmilz1?+ZjkX%kfn4{_6K_D{wb~rdbkh!!k!Z@cE z^&jz55*QtsuNSlGPrU=R?}{*_8?4L7(+?>?(^3Ss)f!ou&{6<9QgH>#2$?-HfmDPN z6oIJ$lRbDZb)h-fFEm^1-v?Slb8udG{7GhbaGD_JJ8a9f{6{TqQN;m@$&)t81k77A z?{{)61za|e2GEq2)-OqcEjP`fhIlUs_Es-dfgX-3{S08g`w=wGj2{?`k^GD8d$}6Z zBT0T1lNw~fuwjO5BurKM593NGYGWAK%UCYiq{$p^GoYz^Uq0$YQ$j5CBXyog8(p_E znTC+$D`*^PFNc3Ih3b!2Lu|OOH6@46D)bbvaZHy%-9=$cz}V^|VPBpmPB6Ivzlu&c zPq6s7(2c4=1M;xlr}bkSmo9P`DAF>?Y*K%VPsY`cVZ{mN&0I=jagJ?GA!I;R)i&@{ z0Gl^%TLf_N`)`WKs?zlWolWvEM_?{vVyo(!taG$`FH2bqB`(o50pA=W34kl-qI62lt z1~4LG_j%sR2tBFteI{&mOTRVU7AH>>-4ZCD_p6;-J<=qrod`YFBwJz(Siu(`S}&}1 z6&OVJS@(O!=HKr-Xyzuhi;swJYK*ums~y1ePdX#~*04=b9)UqHHg;*XJOxnS6XK#j zG|O$>^2eW2ZVczP8#$C`EpcWwPFX4^}$omn{;P(fL z>J~%-r5}*D3$Kii z34r@JmMW2XEa~UV{bYP=F;Y5=9miJ+Jw6tjkR+cUD5+5TuKI`mSnEaYE2=usXNBs9 zac}V13%|q&Yg6**?H9D620qj62dM+&&1&a{NjF}JqmIP1I1RGppZ|oIfR}l1>itC% zl>ed${{_}8^}m2^br*AIX$L!Vc?Sm@H^=|LnpJg`a7EC+B;)j#9#tx-o0_e4!F5-4 zF4gA;#>*qrpow9W%tBzQ89U6hZ9g=-$gQpCh6Nv_I0X7t=th2ajJ8dBbh{i)Ok4{I z`Gacpl?N$LjC$tp&}7Sm(?A;;Nb0>rAWPN~@3sZ~0_j5bR+dz;Qs|R|k%LdreS3Nn zp*36^t#&ASm=jT)PIjNqaSe4mTjAzlAFr*@nQ~F+Xdh$VjHWZMKaI+s#FF#zjx)BJ zufxkW_JQcPcHa9PviuAu$lhwPR{R{7CzMUi49=MaOA%ElpK;A)6Sgsl7lw)D$8FwE zi(O6g;m*86kcJQ{KIT-Rv&cbv_SY4 zpm1|lSL*o_1LGOlBK0KuU2?vWcEcQ6f4;&K=&?|f`~X+s8H)se?|~2HcJo{M?Ity) zE9U!EKGz2^NgB6Ud;?GcV*1xC^1RYIp&0fr;DrqWLi_Kts()-#&3|wz{wFQsKfnnsC||T?oIgUp z{O(?Df7&vW!i#_~*@naguLLjDAz+)~*_xV2iz2?(N|0y8DMneikrT*dG`mu6vdK`% z=&nX5{F-V!Reau}+w_V3)4?}h@A@O)6GCY7eXC{p-5~p8x{cH=hNR;Sb{*XloSZ_%0ZKYG=w<|!vy?spR4!6mF!sXMUB5S9o_lh^g0!=2m55hGR; z-&*BZ*&;YSo474=SAM!WzrvjmNtq17L`kxbrZ8RN419e=5CiQ-bP1j-C#@@-&5*(8 zRQdU~+e(teUf}I3tu%PB1@Tr{r=?@0KOi3+Dy8}+y#bvgeY(FdN!!`Kb>-nM;7u=6 z;0yBwOJ6OdWn0gnuM{0`*fd=C(f8ASnH5aNYJjpbY1apTAY$-%)uDi$%2)lpH=#)=HH z<9JaYwPKil@QbfGOWvJ?cN6RPBr`f+jBC|-dO|W@x_Vv~)bmY(U(!cs6cnhe0z31O z>yTtL4@KJ*ac85u9|=LFST22~!lb>n7IeHs)_(P_gU}|8G>{D_fJX)8BJ;Se? z67QTTlTzZykb^4!{xF!=C}VeFd@n!9E)JAK4|vWVwWop5vSWcD<;2!88v-lS&ve7C zuYRH^85#hGKX(Mrk};f$j_V&`Nb}MZy1mmfz(e`nnI4Vpq(R}26pZx?fq%^|(n~>* z5a5OFtFJJfrZmgjyHbj1`9||Yp?~`p2?4NCwu_!!*4w8K`&G7U_|np&g7oY*-i;sI zu)~kYH;FddS{7Ri#Z5)U&X3h1$Mj{{yk1Q6bh4!7!)r&rqO6K~{afz@bis?*a56i& zxi#(Ss6tkU5hDQJ0{4sKfM*ah0f$>WvuRL zunQ-eOqa3&(rv4kiQ(N4`FO6w+nko_HggKFWx@5aYr}<~8wuEbD(Icvyl~9QL^MBt zSvD)*C#{2}!Z55k1ukV$kcJLtW2d~%z$t0qMe(%2qG`iF9K_Gsae7OO%Tf8E>ooch ztAw01`WVv6?*14e1w%Wovtj7jz_)4bGAqqo zvTD|B4)Ls8x7-yr6%tYp)A7|A)x{WcI&|&DTQR&2ir(KGR7~_RhNOft)wS<+vQ*|sf;d>s zEfl&B^*ZJp$|N`w**cXOza8(ARhJT{O3np#OlfxP9Nnle4Sto)Fv{w6ifKIN^f1qO*m8+MOgA1^Du!=(@MAh8)@wU8t=Ymh!iuT_lzfm za~xEazL-0xwy9$48!+?^lBwMV{!Gx)N>}CDi?Jwax^YX@_bxl*+4itP;DrTswv~n{ zZ0P>@EB({J9ZJ(^|ptn4ks^Z2UI&87d~J_^z0&vD2yb%*H^AE!w= zm&FiH*c%vvm{v&i3S>_hacFH${|(2+q!`X~zn4$aJDAry>=n|{C7le(0a)nyV{kAD zlud4-6X>1@-XZd`3SKKHm*XNn_zCyKHmf*`C_O509$iy$Wj`Sm3y?nWLCDy>MUx1x zl-sz7^{m(&NUk*%_0(G^>wLDnXW90FzNi$Tu6* z<+{ePBD`%IByu977rI^x;gO5M)Tfa-l*A2mU-#IL2?+NXK-?np<&2rlF;5kaGGrx2 zy8Xrz`kHtTVlSSlC=nlV4_oCsbwyVHG4@Adb6RWzd|Otr!LU=% zEjM5sZ#Ib4#jF(l!)8Na%$5VK#tzS>=05GpV?&o* z3goH1co0YR=)98rPJ~PuHvkA59KUi#i(Mq_$rApn1o&n1mUuZfFLjx@3;h`0^|S##QiTP8rD`r8P+#D@gvDJh>amMIl065I)PxT6Hg(lJ?X7*|XF2Le zv36p8dWHCo)f#C&(|@i1RAag->5ch8TY!LJ3(+KBmLxyMA%8*X%_ARR*!$AL66nF= z=D}uH)D)dKGZ5AG)8N-;Il*-QJ&d8u30&$_Q0n1B58S0ykyDAyGa+BZ>FkiOHm1*& zNOVH;#>Hg5p?3f(7#q*dL74;$4!t?a#6cfy#}9H3IFGiCmevir5@zXQj6~)@zYrWZ zRl*e66rjwksx-)Flr|Kzd#Bg>We+a&E{h7bKSae9P~ z(g|zuXmZ zD?R*MlmoZ##+0c|cJ(O{*h(JtRdA#lChYhfsx25(Z`@AK?Q-S8_PQqk z>|Z@Ki1=wL1_c6giS%E4YVYD|Y-{^ZzFwB*yN8-4#+TxeQ`jhks7|SBu7X|g=!_XL z`mY=0^chZfXm%2DYHJ4z#soO7=NONxn^K3WX={dV>$CTWSZe@<81-8DVtJEw#Uhd3 zxZx+($6%4a&y_rD8a&E`4$pD6-_zZJ%LEE*1|!9uOm!kYXW< zOBXZAowsX-&$5C`xgWkC43GcnY)UQt2Qkib4!!8Mh-Q!_M%5{EC=Gim@_;0+lP%O^ zG~Q$QmatQk{Mu&l{q~#kOD;T-{b1P5u7)o-QPPnqi?7~5?7%IIFKdj{;3~Hu#iS|j z)Zoo2wjf%+rRj?vzWz(6JU`=7H}WxLF*|?WE)ci7aK?SCmd}pMW<{#1Z!_7BmVP{w zSrG>?t}yNyCR%ZFP?;}e8_ zRy67~&u11TN4UlopWGj6IokS{vB!v!n~TJYD6k?~XQkpiPMUGLG2j;lh>Eb5bLTkX zx>CZlXdoJsiPx=E48a4Fkla>8dZYB%^;Xkd(BZK$z3J&@({A`aspC6$qnK`BWL;*O z-nRF{XRS`3Y&b+}G&|pE1K-Ll_NpT!%4@7~l=-TtYRW0JJ!s2C-_UsRBQ=v@VQ+4> z*6jF0;R@5XLHO^&PFyaMDvyo?-lAD(@H61l-No#t@at@Le9xOgTFqkc%07KL^&iss z!S2Ghm)u#26D(e1Q7E;L`rxOy-N{kJ zTgfw}az9=9Su?NEMMtpRlYwDxUAUr8F+P=+9pkX4%iA4&&D<|=B|~s*-U+q6cq`y* zIE+;2rD7&D5X;VAv=5rC5&nP$E9Z3HKTqIFCEV%V;b)Y|dY?8ySn|FD?s3IO>VZ&&f)idp_7AGnwVd1Z znBUOBA}~wogNpEWTt^1Rm-(YLftB=SU|#o&pT7vTr`bQo;=ZqJHIj2MP{JuXQPV7% z0k$5Ha6##aGly<}u>d&d{Hkpu?ZQeL_*M%A8IaXq2SQl35yW9zs4^CZheVgHF`%r= zs(Z|N!gU5gj-B^5{*sF>;~fauKVTq-Ml2>t>E0xl9wywD&nVYZfs1F9Lq}(clpNLz z4O(gm_i}!k`wUoKr|H#j#@XOXQ<#eDGJ=eRJjhOUtiKOG;hym-1Hu)1JYj+Kl*To<8( za1Kf4_Y@Cy>eoC59HZ4o&xY@!G(2p^=wTCV>?rQE`Upo^pbhWdM$WP4HFdDy$HiZ~ zRUJFWTII{J$GLVWR?miDjowFk<1#foE3}C2AKTNFku+BhLUuT>?PATB?WVLzEYyu+ zM*x((pGdotzLJ{}R=OD*jUexKi`mb1MaN0Hr(Wk8-Uj0zA;^1w2rmxLI$qq68D>^$ zj@)~T1l@K|~@YJ6+@1vlWl zHg5g%F{@fW5K!u>4LX8W;ua(t6YCCO_oNu}IIvI6>Fo@MilYuwUR?9p)rKNzDmTAN zzN2d>=Za&?Z!rJFV*;mJ&-sBV80%<-HN1;ciLb*Jk^p?u<~T25%7jjFnorfr={+wm zzl5Q6O>tsN8q*?>uSU6#xG}FpAVEQ_++@}G$?;S7owlK~@trhc#C)TeIYj^N(R&a} zypm~c=fIs;M!YQrL}5{xl=tUU-Tfc0ZfhQuA-u5(*w5RXg!2kChQRd$Fa8xQ0CQIU zC`cZ*!!|O!*y1k1J^m8IIi|Sl3R}gm@CC&;4840^9_bb9%&IZTRk#=^H0w%`5pMDCUef5 zYt-KpWp2ijh+FM`!zZ35>+7eLN;s3*P!bp%-oSx34fdTZ14Tsf2v7ZrP+mitUx$rS zW(sOi^CFxe$g3$x45snQwPV5wpf}>5OB?}&Gh<~i(mU&ss#7;utaLZ!|KaTHniGO9 zVC9OTzuMKz)afey_{93x5S*Hfp$+r*W>O^$2ng|ik!<`U1pkxm3*)PH*d#>7md1y} zs7u^a8zW8bvl92iN;*hfOc-=P7{lJeJ|3=NfX{(XRXr;*W3j845SKG&%N zuBqCtDWj*>KooINK1 zFPCsCWr!-8G}G)X*QM~34R*k zmRmDGF*QE?jCeNfc?k{w<}@29e}W|qKJ1K|AX!htt2|B`nL=HkC4?1bEaHtGBg}V( zl(A`6z*tck_F$4;kz-TNF%7?=20iqQo&ohf@S{_!TTXnVh}FaW2jxAh(DI0f*SDG- z7tqf5X@p#l?7pUNI(BGi>n_phw=lDm>2OgHx-{`T>KP2YH9Gm5ma zb{>7>`tZ>0d5K$j|s2!{^sFWQo3+xDb~#=9-jp(1ydI3_&RXGB~rxWSMgDCGQG)oNoc#>)td zqE|X->35U?_M6{^lB4l(HSN|`TC2U*-`1jSQeiXPtvVXdN-?i1?d#;pw%RfQuKJ|e zjg75M+Q4F0p@8I3ECpBhGs^kK;^0;7O@MV=sX^EJLVJf>L;GmO z3}EbTcoom7QbI(N8ad!z(!6$!MzKaajSRb0c+ZDQ($kFT&&?GvXmu7+V3^_(VJx1z zP-1kW_AB&_A;cxm*g`$ z#Pl@Cg{siF0ST2-w)zJkzi@X)5i@)Z;7M5ewX+xcY36IaE0#flASPY2WmF8St0am{ zV|P|j9wqcMi%r-TaU>(l*=HxnrN?&qAyzimA@wtf;#^%{$G7i4nXu=Pp2#r@O~wi)zB>@25A*|axl zEclXBlXx1LP3x0yrSx@s-kVW4qlF+idF+{M7RG54CgA&soDU-3SfHW@-6_ z+*;{n_SixmGCeZjHmEE!IF}!#aswth_{zm5Qhj0z-@I}pR?cu=P)HJUBClC;U+9;$#@xia30o$% zDw%BgOl>%vRenxL#|M$s^9X}diJ9q7wI1-0n2#6>@q}rK@ng(4M68(t52H_Jc{f&M9NPxRr->vj-88hoI?pvpn}llcv_r0`;uN>wuE{ z&TOx_i4==o;)>V4vCqG)A!mW>dI^Ql8BmhOy$6^>OaUAnI3>mN!Zr#qo4A>BegYj` zNG_)2Nvy2Cqxs1SF9A5HHhL7sai#Umw%K@+riaF+q)7&MUJvA&;$`(w)+B@c6!kX@ zzuY;LGu6|Q2eu^06PzSLspV2v4E?IPf`?Su_g8CX!75l)PCvyWKi4YRoRThB!-BhG zubQ#<7oCvj@z`^y&mPhSlbMf0<;0D z?5&!I?nV-jh-j1g~&R(YL@c=KB_gNup$8abPzXZN`N|WLqxlN)ZJ+#k4UWq#WqvVD z^|j+8f5uxTJtgcUscKTqKcr?5g-Ih3nmbvWvvEk})u-O}h$=-p4WE^qq7Z|rLas0$ zh0j&lhm@Rk(6ZF0_6^>Rd?Ni-#u1y`;$9tS;~!ph8T7fLlYE{P=XtWfV0Ql z#z{_;A%p|8+LhbZT0D_1!b}}MBx9`R9uM|+*`4l3^O(>Mk%@ha>VDY=nZMMb2TnJ= zGlQ+#+pmE98zuFxwAQcVkH1M887y;Bz&EJ7chIQQe!pgWX>(2ruI(emhz@_6t@k8Z zqFEyJFX2PO`$gJ6p$=ku{7!vR#u+$qo|1r;orjtp9FP^o2`2_vV;W&OT)acRXLN^m zY8a;geAxg!nbVu|uS8>@Gvf@JoL&GP`2v4s$Y^5vE32&l;2)`S%e#AnFI-YY7_>d#IKJI!oL6e z_7W3e=-0iz{bmuB*HP+D{Nb;rn+RyimTFqNV9Bzpa0?l`pWmR0yQOu&9c0S*1EPr1 zdoHMYlr>BycjTm%WeVuFd|QF8I{NPT&`fm=dITj&3(M^q ze2J{_2zB;wDME%}SzVWSW6)>1QtiX)Iiy^p2eT}Ii$E9w$5m)kv(3wSCNWq=#DaKZ zs%P`#^b7F-J0DgQ1?~2M`5ClYtYN{AlU|v4pEg4z03=g6nqH`JjQuM{k`!6jaIL_F zC;sn?1x?~uMo_DFg#ypNeie{3udcm~M&bYJ1LI zE%y}P9oCX3I1Y9yhF(y9Ix_=8L(p)EYr&|XZWCOb$7f2qX|A4aJ9bl7pt40Xr zXUT#NMBB8I@xoIGSHAZkYdCj>eEd#>a;W-?v4k%CwBaR5N>e3IFLRbDQTH#m_H+4b zk2UHVymC`%IqwtHUmpS1!1p-uQB`CW1Y!+VD!N4TT}D8(V0IOL|&R&)Rwj@n8g@=`h&z9YTPDT+R9agnwPuM!JW~=_ya~% zIJ*>$Fl;y7_`B7G4*P!kcy=MnNmR`(WS5_sRsvHF42NJ;EaDram5HwQ4Aw*qbYn0j;#)bh1lyKLg#dYjN*BMlh+fxmCL~?zB;HBWho;20WA==ci0mAqMfyG>1!HW zO7rOga-I9bvut1Ke_1eFo9tbzsoPTXDW1Si4}w3fq^Z|5LGf&egnw%DV=b11$F=P~ z(aV+j8S}m=CkI*8=RcrT>GmuYifP%hCoKY22Z4 zmu}o08h3YhcXx-v-QC??8mDn<+}+*X{+gZH-I;G^|7=1fBveS?J$27H&wV5^V^P$! z84?{UeYSmZ3M!@>UFoIN?GJT@IroYr;X@H~ax*CQ>b5|Xi9FXt5j`AwUPBq`0sWEJ z3O|k+g^JKMl}L(wfCqyMdRj9yS8ncE7nI14Tv#&(?}Q7oZpti{Q{Hw&5rN-&i|=fWH`XTQSu~1jx(hqm$Ibv zRzFW9$xf@oZAxL~wpj<0ZJ3rdPAE=0B>G+495QJ7D>=A&v^zXC9)2$$EnxQJ<^WlV zYKCHb1ZzzB!mBEW2WE|QG@&k?VXarY?umPPQ|kziS4{EqlIxqYHP!HN!ncw6BKQzKjqk!M&IiOJ9M^wc~ZQ1xoaI z;4je%ern~?qi&J?eD!vTl__*kd*nFF0n6mGEwI7%dI9rzCe~8vU1=nE&n4d&8}pdL zaz`QAY?6K@{s2x%Sx%#(y+t6qLw==>2(gb>AksEebXv=@ht>NBpqw=mkJR(c?l7vo z&cV)hxNoYPGqUh9KAKT)kc(NqekzE6(wjjotP(ac?`DJF=Sb7^Xet-A3PRl%n&zKk zruT9cS~vV1{%p>OVm1-miuKr<@rotj*5gd$?K`oteNibI&K?D63RoBjw)SommJ5<4 zus$!C8aCP{JHiFn2>XpX&l&jI7E7DcTjzuLYvON2{rz<)#$HNu(;ie-5$G<%eLKnTK7QXfn(UR(n+vX%aeS6!q6kv z!3nzY76-pdJp339zsl_%EI|;ic_m56({wdc(0C5LvLULW=&tWc5PW-4;&n+hm1m`f zzQV0T>OPSTjw=Ox&UF^y< zarsYKY8}YZF+~k70=olu$b$zdLaozBE|QE@H{_R21QlD5BilYBTOyv$D5DQZ8b1r- zIpSKX!SbA0Pb5#cT)L5!KpxX+x+8DRy&`o-nj+nmgV6-Gm%Fe91R1ca3`nt*hRS|^ z<&we;TJcUuPDqkM7k0S~cR%t7a`YP#80{BI$e=E!pY}am)2v3-Iqk2qvuAa1YM>xj#bh+H2V z{b#St2<;Gg>$orQ)c2a4AwD5iPcgZ7o_}7xhO86(JSJ(q(EWKTJDl|iBjGEMbX8|P z4PQHi+n(wZ_5QrX0?X_J)e_yGcTM#E#R^u_n8pK@l5416`c9S=q-e!%0RjoPyTliO zkp{OC@Ep^#Ig-n!C)K0Cy%8~**Vci8F1U(viN{==KU0nAg2(+K+GD_Gu#Bx!{tmUm zCwTrT(tCr6X8j43_n96H9%>>?4akSGMvgd+krS4wRexwZ1JxrJy!Uhz#yt$-=aq?A z@?*)bRZxjG9OF~7d$J0cwE_^CLceRK=LvjfH-~{S><^D;6B2&p-02?cl?|$@>`Qt$ zP*iaOxg<+(rbk>34VQDQpNQ|a9*)wScu!}<{oXC87hRPqyrNWpo?#=;1%^D2n2+C* zKKQH;?rWn-@%Y9g%NHG&lHwK9pBfV1a`!TqeU_Fv8s6_(@=RHua7`VYO|!W&WL*x= zIWE9eQaPq3zMaXuf)D0$V`RIZ74f)0P73xpeyk4)-?8j;|K%pD$eq4j2%tL=;&+E91O(2p91K|85b)GQcbRe&u6Ilu@SnE={^{Ix1Eqgv8D z4=w65+&36|;5WhBm$!n*!)ACCwT9Sip#1_z&g~E1kB=AlEhO0lu`Ls@6gw*a)lzc# zKx!fFP%eSBBs)U>xIcQKF(r_$SWD3TD@^^2Ylm=kC*tR+I@X>&SoPZdJ2fT!ysjH% z-U%|SznY8Fhsq7Vau%{Ad^Pvbf3IqVk{M2oD+w>MWimJA@VSZC$QooAO3 zC=DplXdkyl>mSp^$zk7&2+eoGQ6VVh_^E#Z3>tX7Dmi<2aqlM&YBmK&U}m>a%8)LQ z8v+c}a0QtXmyd%Kc2QNGf8TK?_EK4wtRUQ*VDnf5jHa?VvH2K(FDZOjAqYufW8oIZ z31|o~MR~T;ZS!Lz%8M0*iVARJ>_G2BXEF8(}6Dmn_rFV~5NI`lJjp`Mi~g7~P%H zO`S&-)Fngo3VXDMo7ImlaZxY^s!>2|csKca6!|m7)l^M0SQT1_L~K29%x4KV8*xiu zwP=GlyIE9YPSTC0BV`6|#)30=hJ~^aYeq7d6TNfoYUkk-^k0!(3qp(7Mo-$|48d8Z2d zrsfsRM)y$5)0G`fNq!V?qQ+nh0xwFbcp{nhW%vZ?h);=LxvM(pWd9FG$Bg1;@Bv)mKDW>AP{ol zD(R~mLzdDrBv$OSi{E%OD`Ano=F^vwc)rNb*Bg3-o)bbAgYE=M7Gj2OHY{8#pM${_^ zwkU|tnTKawxUF7vqM9UfcQ`V49zg78V%W)$#5ssR}Rj7E&p(4_ib^?9luZPJ%iJTvW&-U$nFYky>KJwHpEHHx zVEC;!ETdkCnO|${Vj#CY>LLut_+c|(hpWk8HRgMGRY%E--%oKh@{KnbQ~0GZd}{b@ z`J2qHBcqqjfHk^q=uQL!>6HSSF3LXL*cCd%opM|k#=xTShX~qcxpHTW*BI!c3`)hQq{@!7^mdUaG7sFsFYnl1%blslM;?B8Q zuifKqUAmR=>33g~#>EMNfdye#rz@IHgpM$~Z7c5@bO@S>MyFE3_F}HVNLnG0TjtXU zJeRWH^j5w_qXb$IGs+E>daTa}XPtrUnnpTRO9NEx4g6uaFEfHP9gW;xZnJi{oqAH~ z5dHS(ch3^hbvkv@u3QPLuWa}ImaElDrmIc%5HN<^bwej}3+?g) z-ai7D&6Iq_P(}k`i^4l?hRLbCb>X9iq2UYMl=`9U9Rf=3Y!gnJbr?eJqy>Zpp)m>Ae zcQ4Qfs&AaE?UDTODcEj#$_n4KeERZHx-I+E5I~E#L_T3WI3cj$5EYR75H7hy%80a8Ej?Y6hv+fR6wHN%_0$-xL!eI}fdjOK7(GdFD%`f%-qY@-i@fTAS&ETI99jUVg8 zslPSl#d4zbOcrgvopvB2c2A6r^pEr&Sa5I5%@1~BpGq`Wo|x=&)WnnQjE+)$^U-wW zr2Kv?XJby(8fcn z8JgPn)2_#-OhZ+;72R6PspMfCVvtLxFHeb7d}fo(GRjm_+R(*?9QRBr+yPF(iPO~ zA4Tp1<0}#fa{v0CU6jz}q9;!3Pew>ikG1qh$5WPRTQZ~ExQH}b1hDuzRS1}65uydS z~Te*3@?o8fih=mZ`iI!hL5iv3?VUBLQv0X zLtu58MIE7Jbm?)NFUZuMN2_~eh_Sqq*56yIo!+d_zr@^c@UwR&*j!fati$W<=rGGN zD$X`$lI%8Qe+KzBU*y3O+;f-Csr4$?3_l+uJ=K@dxOfZ?3APc5_x2R=a^kLFoxt*_ z4)nvvP+(zwlT5WYi!4l7+HKqzmXKYyM9kL5wX$dTSFSN&)*-&8Q{Q$K-})rWMin8S zy*5G*tRYNqk7&+v;@+>~EIQgf_SB;VxRTQFcm5VtqtKZ)x=?-f+%OY(VLrXb^6*aP zP&0Nu@~l2L!aF8i2!N~fJiHyxRl?I1QNjB)`uP_DuaU?2W;{?0#RGKTr2qH5QqdhK zP__ojm4WV^PUgmrV)`~f>(769t3|13DrzdDeXxqN6XA|_GK*;zHU()a(20>X{y-x| z2P6Ahq;o=)Nge`l+!+xEwY`7Q(8V=93A9C+WS^W%p&yR)eiSX+lp)?*7&WSYSh4i> zJa6i5T9o;Cd5z%%?FhB?J{l+t_)c&_f86gZMU{HpOA=-KoU5lIL#*&CZ_66O5$3?# ztgjGLo`Y7bj&eYnK#5x1trB_6tpu4$EomotZLb*9l6P(JmqG`{z$?lNKgq?GAVhkA zvw!oFhLyX=$K=jTAMwDQ)E-8ZW5$X%P2$YB5aq!VAnhwGv$VR&;Ix#fu%xlG{|j_K zbEYL&bx%*YpXcaGZj<{Y{k@rsrFKh7(|saspt?OxQ~oj_6En(&!rTZPa7fLCEU~mA zB7tbVs=-;cnzv*#INgF_9f3OZhp8c5yk!Dy1+`uA7@eJfvd~g34~wKI1PW%h(y&nA zRwMni12AHEw36)C4Tr-pt6s82EJa^8N#bjy??F*rg4fS@?6^MbiY3;7x=gd~G|Hi& zwmG+pAn!aV>>nNfP7-Zn8BLbJm&7}&ZX+$|z5*5{{F}BRSxN=JKZTa#{ut$v0Z0Fs za@UjXo#3!wACv+p9k*^9^n+(0(YKIUFo`@ib@bjz?Mh8*+V$`c%`Q>mrc5bs4aEf4 zh0qtL1qNE|xQ9JrM}qE>X>Y@dQ?%` zBx(*|1FMzVY&~|dE^}gHJ37O9bjnk$d8vKipgcf+As(kt2cbxAR3^4d0?`}}hYO*O z{+L&>G>AYaauAxE8=#F&u#1YGv%`d*v+EyDcU2TnqvRE33l1r}p#Vmcl%n>NrYOqV z2Car_^^NsZ&K=a~bj%SZlfxzHAxX$>=Q|Zi;E0oyfhgGgqe1Sd5-E$8KV9=`!3jWZCb2crb;rvQ##iw}xm7Da za!H${ls5Ihwxkh^D)M<4Yy3bp<-0a+&KfV@CVd9X6Q?v)$R3*rfT@jsedSEhoV(vqv?R1E8oWV;_{l_+_6= zLjV^-bZU$D_ocfSpRxDGk*J>n4G6s-e>D8JK6-gA>aM^Hv8@)txvKMi7Pi#DS5Y?r zK0%+L;QJdrIPXS2 ztjWAxkSwt2xG$L)Zb7F??cjs!KCTF+D{mZ5e0^8bdu_NLgFHTnO*wx!_8#}NO^mu{FaYeCXGjnUgt_+B-Ru!2_Ue-0UPg2Y)K3phLmR<4 zqUCWYX!KDU!jYF6c?k;;vF@Qh^q(PWwp1ez#I+0>d7V(u_h|L+kX+MN1f5WqMLn!L z!c(pozt7tRQi&duH8n=t-|d)c^;%K~6Kpyz(o53IQ_J+aCapAif$Ek#i0F9U>i+94 zFb=OH5(fk-o`L(o|DyQ(hlozl*2cu#)Y(D*zgNMi1Z!DTex#w#)x(8A-T=S+eByJW z%-k&|XhdZOWjJ&(FTrZNWRm^pHEot_MRQ_?>tKQ&MB~g(&D_e>-)u|`Ot(4j=UT6? zQ&YMi2UnCKlBpwltP!}8a2NJ`LlfL=k8SQf69U)~=G;bq9<2GU&Q#cHwL|o4?ah1` z;fG)%t0wMC;DR?^!jCoKib_iiIjsxCSxRUgJDCE%0P;4JZhJCy)vR1%zRl>K?V6#) z2lDi*W3q9rA zo;yvMujs+)a&00~W<-MNj=dJ@4%tccwT<@+c$#CPR%#aE#Dra+-5eSDl^E>is2v^~ z8lgRwkpeU$|1LW4yFwA{PQ^A{5JY!N5PCZ=hog~|FyPPK0-i;fCl4a%1 z?&@&E-)b4cK)wjXGq|?Kqv0s7y~xqvSj-NpOImt{Riam*Z!wz-coZIMuQU>M%6ben z>P@#o^W;fizVd#?`eeEPs#Gz^ySqJn+~`Pq%-Ee6*X+E>!PJGU#rs6qu0z5{+?`-N zxf1#+JNk7e6AoJTdQwxs&GMTq?Djch_8^xL^A;9XggtGL>!@0|BRuIdE&j$tzvt7I zr@I@0<0io%lpF697s1|qNS|BsA>!>-9DVlgGgw2;;k;=7)3+&t!);W3ulPgR>#JiV zUerO;WxuJqr$ghj-veVGfKF?O7si#mzX@GVt+F&atsB@NmBoV4dK|!owGP005$7LN7AqCG(S+={YA- zn#I{UoP_$~Epc=j78{(!2NLN)3qSm-1&{F&1z4Dz&7Mj_+SdlR^Q5{J=r822d4A@?Rj~xATaWewHUOus{*C|KoH`G zHB8SUT06GpSt)}cFJ18!$Kp@r+V3tE_L^^J%9$&fcyd_AHB)WBghwqBEWW!oh@StV zDrC?ttu4#?Aun!PhC4_KF1s2#kvIh~zds!y9#PIrnk9BWkJpq}{Hlqi+xPOR&A1oP zB0~1tV$Zt1pQuHpJw1TAOS=3$Jl&n{n!a+&SgYVe%igUtvE>eHqKY0`e5lwAf}2x( zP>9Wz+9uirp7<7kK0m2&Y*mzArUx%$CkV661=AIAS=V=|xY{;$B7cS5q0)=oq0uXU z_roo90&gHSfM6@6kmB_FJZ)3y_tt0}7#PA&pWo@_qzdIMRa-;U*Dy>Oo#S_n61Fn! z%mrH%tRmvQvg%UqN_2(C#LSxgQ>m}FKLGG=uqJQuSkk=S@c~QLi4N+>lr}QcOuP&% zQCP^cRk&rk-@lpa0^Lcvdu`F*qE)-0$TnxJlwZf|dP~s8cjhL%>^+L~{umxl5Xr6@ z^7zVKiN1Xg;-h+kr4Yt2BzjZs-Mo54`pDbLc}fWq{34=6>U9@sBP~iWZE`+FhtU|x zTV}ajn*Hc}Y?3agQ+bV@oIRm=qAu%|zE;hBw7kCcDx{pm!_qCxfPX3sh5^B$k_2d` z6#rAeUZC;e-LuMZ-f?gHeZogOa*mE>ffs+waQ+fQl4YKoAyZii_!O0;h55EMzD{;) z8lSJvv((#UqgJ?SCQFqJ-UU?2(0V{;7zT3TW`u6GH6h4m3}SuAAj_K(raGBu>|S&Q zZGL?r9@caTbmRm7p=&Tv?Y1)60*9At38w)$(1c?4cpFY2RLyw9c<{OwQE{b@WI}FQ zTT<2HOF4222d%k70yL~x_d#6SNz`*%@4++8gYQ8?yq0T@w~bF@aOHL2)T4xj`AVps9k z?m;<2ClJh$B6~fOYTWIV*T9y1BpB1*C?dgE{%lVtIjw>4MK{wP6OKTb znbPWrkZjYCbr`GGa%Xo0h;iFPNJBI3fK5`wtJV?wq_G<_PZ<`eiKtvN$IKfyju*^t zXc}HNg>^PPZ16m6bfTpmaW5=qoSsj>3)HS}teRa~qj+Y}mGRE?cH!qMDBJ8 zJB!&-=MG8Tb;V4cZjI_#{>ca0VhG_P=j0kcXVX5)^Sdpk+LKNv#yhpwC$k@v^Am&! z_cz2^4Cc{_BC!K#zN!KEkPzviUFPJ^N_L-kHG6}(X#$>Q=9?!{$A(=B3)P?PkxG9gs#l! zo6TOHo$F|IvjTC3MW%XrDoc7;m-6wb9mL(^2(>PQXY53hE?%4FW$rTHtN`!VgH72U zRY)#?Y*pMA<)x3B-&fgWQ(TQ6S6nUeSY{9)XOo_k=j$<*mA=f+ghSALYwBw~!Egn!jtjubOh?6Cb-Zi3IYn*fYl()^3u zRiX0I{5QaNPJ9w{yh4(o#$geO7b5lSh<5ZaRg9_=aFdZjxjXv(_SCv^v-{ZKQFtAA}kw=GPC7l81GY zeP@0Da{aR#{6`lbI0ON0y#K=t|L*}MG_HSl$e{U;v=BSs{SU3(e*qa(l%rD;(zM^3 zrRgN3M#Sf(Cr9>v{FtB`8JBK?_zO+~{H_0$lLA!l{YOs9KQd4Zt<3*Ns7dVbT{1Ut z?N9{XkN(96?r(4BH~3qeiJ_CAt+h1}O_4IUF$S(5EyTyo=`{^16P z=VhDY!NxkDukQz>T`0*H=(D3G7Np*2P`s(6M*(*ZJa;?@JYj&_z`d5bap=KK37p3I zr5#`%aC)7fUo#;*X5k7g&gQjxlC9CF{0dz*m2&+mf$Sc1LnyXn9lpZ!!Bl!@hnsE5px};b-b-`qne0Kh;hziNC zXV|zH%+PE!2@-IrIq!HM2+ld;VyNUZiDc@Tjt|-1&kq}>muY;TA3#Oy zWdYGP3NOZWSWtx6?S6ES@>)_Yz%%nLG3P>Z7`SrhkZ?shTfrHkYI;2zAn8h65wV3r z^{4izW-c9!MTge3eN=~r5aTnz6*6l#sD68kJ7Nv2wMbL~Ojj0H;M`mAvk*`Q!`KI? z7nCYBqbu$@MSNd+O&_oWdX()8Eh|Z&v&dJPg*o-sOBb2hriny)< zd(o&&kZM^NDtV=hufp8L zCkKu7)k`+czHaAU567$?GPRGdkb4$37zlIuS&<&1pgArURzoWCbyTEl9OiXZBn4p<$48-Gekh7>e)v*?{9xBt z=|Rx!@Y3N@ffW5*5!bio$jhJ7&{!B&SkAaN`w+&3x|D^o@s{ZAuqNss8K;211tUWIi1B!%-ViYX+Ys6w)Q z^o1{V=hK#+tt&aC(g+^bt-J9zNRdv>ZYm9KV^L0y-yoY7QVZJ_ivBS02I|mGD2;9c zR%+KD&jdXjPiUv#t1VmFOM&=OUE2`SNm4jm&a<;ZH`cYqBZoAglCyixC?+I+}*ScG#;?SEAFob{v0ZKw{`zw*tX}<2k zoH(fNh!>b5w8SWSV}rQ*E24cO=_eQHWy8J!5;Y>Bh|p;|nWH|nK9+ol$k`A*u*Y^Uz^%|h4Owu}Cb$zhIxlVJ8XJ0xtrErT zcK;34CB;ohd|^NfmVIF=XlmB5raI}nXjFz;ObQ4Mpl_`$dUe7sj!P3_WIC~I`_Xy@ z>P5*QE{RSPpuV=3z4p3}dh>Dp0=We@fdaF{sJ|+_E*#jyaTrj-6Y!GfD@#y@DUa;& zu4Iqw5(5AamgF!2SI&WT$rvChhIB$RFFF|W6A>(L9XT{0%DM{L`knIQPC$4F`8FWb zGlem_>>JK-Fib;g*xd<-9^&_ue95grYH>5OvTiM;#uT^LVmNXM-n8chJBD2KeDV7t zbnv3CaiyN>w(HfGv86K5MEM{?f#BTR7**smpNZ}ftm+gafRSt=6fN$(&?#6m3hF!>e$X)hFyCF++Qvx(<~q3esTI zH#8Sv!WIl2<&~=B)#sz1x2=+KTHj=0v&}iAi8eD=M->H|a@Qm|CSSzH#eVIR3_Tvu zG8S**NFbz%*X?DbDuP(oNv2;Lo@#_y4k$W+r^#TtJ8NyL&&Rk;@Q}~24`BB)bgwcp z=a^r(K_NEukZ*|*7c2JKrm&h&NP)9<($f)eTN}3|Rt`$5uB0|!$Xr4Vn#i;muSljn zxG?zbRD(M6+8MzGhbOn%C`M#OcRK!&ZHihwl{F+OAnR>cyg~No44>vliu$8^T!>>*vYQJCJg=EF^lJ*3M^=nGCw`Yg@hCmP(Gq^=eCEE1!t-2>%Al{w@*c% zUK{maww*>K$tu;~I@ERb9*uU@LsIJ|&@qcb!&b zsWIvDo4#9Qbvc#IS%sV1_4>^`newSxEcE08c9?rHY2%TRJfK2}-I=Fq-C)jc`gzV( zCn?^noD(9pAf2MP$>ur0;da`>Hr>o>N@8M;X@&mkf;%2A*2CmQBXirsJLY zlX21ma}mKH_LgYUM-->;tt;6F?E5=fUWDwQhp*drQ%hH0<5t2m)rFP%=6aPIC0j$R znGI0hcV~}vk?^&G`v~YCKc7#DrdMM3TcPBmxx#XUC_JVEt@k=%3-+7<3*fTcQ>f~?TdLjv96nb66xj=wVQfpuCD(?kzs~dUV<}P+Fpd)BOTO^<*E#H zeE80(b~h<*Qgez(iFFOkl!G!6#9NZAnsxghe$L=Twi^(Q&48 zD0ohTj)kGLD){xu%pm|}f#ZaFPYpHtg!HB30>F1c=cP)RqzK2co`01O5qwAP zUJm0jS0#mci>|Nu4#MF@u-%-4t>oUTnn_#3K09Hrwnw13HO@9L;wFJ*Z@=gCgpA@p zMswqk;)PTXWuMC-^MQxyNu8_G-i3W9!MLd2>;cM+;Hf&w| zLv{p*hArp9+h2wsMqT5WVqkkc0>1uokMox{AgAvDG^YJebD-czexMB!lJKWllLoBI zetW2;;FKI1xNtA(ZWys!_un~+834+6y|uV&Lo%dKwhcoDzRADYM*peh{o`-tHvwWIBIXW`PKwS3|M>CW37Z2dr!uJWNFS5UwY4;I zNIy1^sr+@8Fob%DHRNa&G{lm?KWU7sV2x9(Ft5?QKsLXi!v6@n&Iyaz5&U*|hCz+d z9vu60IG<v6+^ZmBs_aN!}p|{f(ikVl&LcB+UY;PPz* zj84Tm>g5~-X=GF_4JrVmtEtm=3mMEL1#z+pc~t^Iify^ft~cE=R0TymXu*iQL+XLX zdSK$~5pglr3f@Lrcp`>==b5Z6r7c=p=@A5nXNacsPfr(5m;~ks@*Wu7A z%WyY$Pt*RAKHz_7cghHuQqdU>hq$vD?plol_1EU(Fkgyo&Q2&2e?FT3;H%!|bhU~D z>VX4-6}JLQz8g3%Bq}n^NhfJur~v5H0dbB^$~+7lY{f3ES}E?|JnoLsAG%l^%eu_PM zEl0W(sbMRB3rFeYG&tR~(i2J0)RjngE`N_Jvxx!UAA1mc7J>9)`c=`}4bVbm8&{A` z3sMPU-!r-8de=P(C@7-{GgB<5I%)x{WfzJwEvG#hn3ict8@mexdoTz*(XX!C&~}L* z^%3eYQ8{Smsmq(GIM4d5ilDUk{t@2@*-aevxhy7yk(wH?8yFz%gOAXRbCYzm)=AsM z?~+vo2;{-jkA%Pqwq&co;|m{=y}y2lN$QPK>G_+jP`&?U&Ubq~T`BzAj1TlC`%8+$ zzdwNf<3suPnbh&`AI7RAYuQ<#!sD|A=ky2?hca{uHsB|0VqShI1G3lG5g}9~WSvy4 zX3p~Us^f5AfXlBZ0hA;mR6aj~Q8yb^QDaS*LFQwg!!<|W!%WX9Yu}HThc7>oC9##H zEW`}UQ%JQ38UdsxEUBrA@=6R-v1P6IoIw8$8fw6F{OSC7`cOr*u?p_0*Jvj|S)1cd z-9T);F8F-Y_*+h-Yt9cQQq{E|y^b@r&6=Cd9j0EZL}Pj*RdyxgJentY49AyC@PM<< zl&*aq_ubX%*pqUkQ^Zsi@DqhIeR&Ad)slJ2g zmeo&+(g!tg$z1ao1a#Qq1J022mH4}y?AvWboI4H028;trScqDQrB36t!gs|uZS9}KG0}DD$ zf2xF}M*@VJSzEJ5>ucf+L_AtN-Ht=34g&C?oPP>W^bwoigIncKUyf61!ce!2zpcNT zj&;rPGI~q2!Sy>Q7_lRX*DoIs-1Cei=Cd=+Xv4=%bn#Yqo@C=V`|QwlF0Y- zONtrwpHQ##4}VCL-1ol(e<~KU9-ja^kryz!g!})y-2S5z2^gE$Isj8l{%tF=Rzy`r z^RcP7vu`jHgHLKUE957n3j+BeE(bf;f)Zw($XaU6rZ26Upl#Yv28=8Y`hew{MbH>* z-sGI6dnb5D&dUCUBS`NLAIBP!Vi!2+~=AU+)^X^IpOEAn#+ab=`7c z%7B|mZ>wU+L;^&abXKan&N)O;=XI#dTV|9OMYxYqLbtT#GY8PP$45Rm2~of+J>>HIKIVn(uQf-rp09_MwOVIp@6!8bKV(C#(KxcW z;Pesq(wSafCc>iJNV8sg&`!g&G55<06{_1pIoL`2<7hPvAzR1+>H6Rx0Ra%4j7H-<-fnivydlm{TBr06;J-Bq8GdE^Amo)ptV>kS!Kyp*`wUx=K@{3cGZnz53`+C zLco1jxLkLNgbEdU)pRKB#Pq(#(Jt>)Yh8M?j^w&RPUueC)X(6`@@2R~PV@G(8xPwO z^B8^+`qZnQr$8AJ7<06J**+T8xIs)XCV6E_3W+al18!ycMqCfV>=rW0KBRjC* zuJkvrv;t&xBpl?OB3+Li(vQsS(-TPZ)Pw2>s8(3eF3=n*i0uqv@RM^T#Ql7(Em{(~%f2Fw|Reg@eSCey~P zBQlW)_DioA*yxxDcER@_=C1MC{UswPMLr5BQ~T6AcRyt0W44ffJG#T~Fk}wU^aYoF zYTayu-s?)<`2H(w+1(6X&I4?m3&8sok^jpXBB<|ZENso#?v@R1^DdVvKoD?}3%@{}}_E7;wt9USgrfR3(wabPRhJ{#1es81yP!o4)n~CGsh2_Yj2F^z|t zk((i&%nDLA%4KFdG96pQR26W>R2^?C1X4+a*hIzL$L=n4M7r$NOTQEo+k|2~SUI{XL{ynLSCPe%gWMMPFLO{&VN2pom zBUCQ(30qj=YtD_6H0-ZrJ46~YY*A;?tmaGvHvS^H&FXUG4)%-a1K~ly6LYaIn+4lG zt=wuGLw!%h=Pyz?TP=?6O-K-sT4W%_|Nl~;k~YA^_`gqfe{Xw=PWn#9f1mNz)sFuL zJbrevo(DPgpirvGMb6ByuEPd=Rgn}fYXqeUKyM+!n(cKeo|IY%p!#va6`D8?A*{u3 zEeWw0*oylJ1X!L#OCKktX2|>-z3#>`9xr~azOH+2dXHRwdfnpri9|xmK^Q~AuY!Fg z`9Xx?hxkJge~)NVkPQ(VaW(Ce2pXEtgY*cL8i4E)mM(iz_vdm|f@%cSb*Lw{WbShh41VGuplex9E^VvW}irx|;_{VK=N_WF39^ zH4<*peWzgc)0UQi4fBk2{FEzldDh5+KlRd!$_*@eYRMMRb1gU~9lSO_>Vh-~q|NTD zL}X*~hgMj$*Gp5AEs~>Bbjjq7G>}>ki1VxA>@kIhLe+(EQS0mjNEP&eXs5)I;7m1a zmK0Ly*!d~Dk4uxRIO%iZ!1-ztZxOG#W!Q_$M7_DKND0OwI+uC;PQCbQ#k#Y=^zQve zTZVepdX>5{JSJb;DX3%3g42Wz2D@%rhIhLBaFmx#ZV8mhya}jo1u{t^tzoiQy=jJp zjY2b7D2f$ZzJx)8fknqdD6fd5-iF8e(V}(@xe)N=fvS%{X$BRvW!N3TS8jn=P%;5j zShSbzsLs3uqycFi3=iSvqH~}bQn1WQGOL4?trj(kl?+q2R23I42!ipQ&`I*&?G#i9 zWvNh8xoGKDt>%@i0+}j?Ykw&_2C4!aYEW0^7)h2Hi7$;qgF3;Go?bs=v)kHmvd|`R z%(n94LdfxxZ)zh$ET8dH1F&J#O5&IcPH3=8o;%>OIT6w$P1Yz4S!}kJHNhMQ1(prc zM-jSA-7Iq=PiqxKSWb+YbLB-)lSkD6=!`4VL~`ExISOh2ud=TI&SKfR4J08Bad&rj zcXxMpcNgOB?w$~L7l^wPcXxw$0=$oV?)`I44)}b#ChS`_lBQhvb6ks?HDr3tFgkg&td19?b8=!sETXtp=&+3T$cCwZe z0nAET-7561gsbBws$TVjP7QxY(NuBYXVn9~9%vyN-B#&tJhWgtL1B<%BTS*-2$xB` zO)cMDHoWsm%JACZF--Pa7oP;f!n%p`*trlpvZ!HKoB={l+-(8O;;eYv2A=ra z3U7rSMCkP_6wAy`l|Se(&5|AefXvV1E#XA(LT!% zjj4|~xlZ-kPLNeQLFyXb%$K}YEfCBvHA-Znw#dZSI6V%3YD{Wj2@utT5Hieyofp6Qi+lz!u)htnI1GWzvQsA)baEuw9|+&(E@p8M+#&fsX@Kf`_YQ>VM+40YLv`3-(!Z7HKYg@+l00WGr779i-%t`kid%e zDtbh8UfBVT3|=8FrNian@aR3*DTUy&u&05x%(Lm3yNoBZXMHWS7OjdqHp>cD>g!wK z#~R{1`%v$IP;rBoP0B0P><;dxN9Xr+fp*s_EK3{EZ94{AV0#Mtv?;$1YaAdEiq5)g zYME;XN9cZs$;*2p63Q9^x&>PaA1p^5m7|W?hrXp2^m;B@xg0bD?J;wIbm6O~Nq^^K z2AYQs@7k)L#tgUkTOUHsh&*6b*EjYmwngU}qesKYPWxU-z_D> zDWr|K)XLf_3#k_9Rd;(@=P^S^?Wqlwert#9(A$*Y$s-Hy)BA0U0+Y58zs~h=YtDKxY0~BO^0&9{?6Nny;3=l59(6ec9j(79M?P1cE zex!T%$Ta-KhjFZLHjmPl_D=NhJULC}i$}9Qt?nm6K6-i8&X_P+i(c*LI3mtl3 z*B+F+7pnAZ5}UU_eImDj(et;Khf-z^4uHwrA7dwAm-e4 zwP1$Ov3NP5ts+e(SvM)u!3aZMuFQq@KE-W;K6 zag=H~vzsua&4Sb$4ja>&cSJ)jjVebuj+?ivYqrwp3!5>ul`B*4hJGrF;!`FaE+wKo z#};5)euvxC1zX0-G;AV@R(ZMl=q_~u8mQ5OYl;@BAkt)~#PynFX#c1K zUQ1^_N8g+IZwUl*n0Bb-vvliVtM=zuMGU-4a8|_8f|2GEd(2zSV?aSHUN9X^GDA8M zgTZW06m*iAy@7l>F3!7+_Y3mj^vjBsAux3$%U#d$BT^fTf-7{Y z_W0l=7$ro5IDt7jp;^cWh^Zl3Ga1qFNrprdu#g=n9=KH!CjLF#ucU5gy6*uASO~|b z7gcqm90K@rqe({P>;ww_q%4}@bq`ST8!0{V08YXY)5&V!>Td)?j7#K}HVaN4FU4DZ z%|7OppQq-h`HJ;rw-BAfH* z1H$ufM~W{%+b@9NK?RAp-$(P0N=b<(;wFbBN0{u5vc+>aoZ|3&^a866X@el7E8!E7 z=9V(Ma**m_{DKZit2k;ZOINI~E$|wO99by=HO{GNc1t?nl8soP@gxk8)WfxhIoxTP zoO`RA0VCaq)&iRDN9yh_@|zqF+f07Esbhe!e-j$^PS57%mq2p=+C%0KiwV#t^%_hH zoO?{^_yk5x~S)haR6akK6d|#2TN& zfWcN zc7QAWl)E9`!KlY>7^DNw$=yYmmRto>w0L(~fe?|n6k2TBsyG@sI)goigj=mn)E)I* z4_AGyEL7?(_+2z=1N@D}9$7FYdTu;%MFGP_mEJXc2OuXEcY1-$fpt8m_r2B|<~Xfs zX@3RQi`E-1}^9N{$(|YS@#{ZWuCxo)91{k>ESD54g_LYhm~vlOK_CAJHeYFfuIVB^%cqCfvpy#sU8Do8u}# z>>%PLKOZ^+$H54o@brtL-hHorSKcsjk_ZibBKBgyHt~L z=T6?e0oLX|h!Z3lbkPMO27MM?xn|uZAJwvmX?Yvp#lE3sQFY)xqet>`S2Y@1t)Z*& z;*I3;Ha8DFhk=YBt~{zp=%%*fEC}_8?9=(-k7HfFeN^GrhNw4e?vx*#oMztnO*&zY zmRT9dGI@O)t^=Wj&Og1R3b%(m*kb&yc;i`^-tqY9(0t!eyOkH<$@~1lXmm!SJllE_ zr~{a&w|8*LI>Z^h!m%YLgKv06Js7j7RaoX}ZJGYirR<#4Mghd{#;38j3|V+&=ZUq#1$ zgZb-7kV)WJUko?{R`hpSrC;w2{qa`(Z4gM5*ZL`|#8szO=PV^vpSI-^K_*OQji^J2 zZ_1142N}zG$1E0fI%uqHOhV+7%Tp{9$bAR=kRRs4{0a`r%o%$;vu!_Xgv;go)3!B#;hC5qD-bcUrKR&Sc%Zb1Y($r78T z=eG`X#IpBzmXm(o6NVmZdCQf6wzqawqI63v@e%3TKuF!cQ#NQbZ^?6K-3`_b=?ztW zA>^?F#dvVH=H-r3;;5%6hTN_KVZ=ps4^YtRk>P1i>uLZ)Ii2G7V5vy;OJ0}0!g>j^ z&TY&E2!|BDIf1}U(+4G5L~X6sQ_e7In0qJmWYpn!5j|2V{1zhjZt9cdKm!we6|Pp$ z07E+C8=tOwF<<}11VgVMzV8tCg+cD_z?u+$sBjwPXl^(Ge7y8-=c=fgNg@FxI1i5Y-HYQMEH z_($je;nw`Otdhd1G{Vn*w*u@j8&T=xnL;X?H6;{=WaFY+NJfB2(xN`G)LW?4u39;x z6?eSh3Wc@LR&yA2tJj;0{+h6rxF zKyHo}N}@004HA(adG~0solJ(7>?LoXKoH0~bm+xItnZ;3)VJt!?ue|~2C=ylHbPP7 zv2{DH()FXXS_ho-sbto)gk|2V#;BThoE}b1EkNYGT8U#0ItdHG>vOZx8JYN*5jUh5Fdr9#12^ zsEyffqFEQD(u&76zA^9Jklbiz#S|o1EET$ujLJAVDYF znX&4%;vPm-rT<8fDutDIPC@L=zskw49`G%}q#l$1G3atT(w70lgCyfYkg7-=+r7$%E`G?1NjiH)MvnKMWo-ivPSQHbk&_l5tedNp|3NbU^wk0SSXF9ohtM zUqXiOg*8ERKx{wO%BimK)=g^?w=pxB1Vu_x<9jKOcU7N;(!o3~UxyO+*ZCw|jy2}V*Z22~KhmvxoTszc+#EMWXTM6QF*ks% zW47#2B~?wS)6>_ciKe1Fu!@Tc6oN7e+6nriSU;qT7}f@DJiDF@P2jXUv|o|Wh1QPf zLG31d>@CpThA+Ex#y)ny8wkC4x-ELYCXGm1rFI=1C4`I5qboYgDf322B_Nk@#eMZ% znluCKW2GZ{r9HR@VY`>sNgy~s+D_GkqFyz6jgXKD)U|*eKBkJRRIz{gm3tUd*yXmR z(O4&#ZA*us6!^O*TzpKAZ#}B5@}?f=vdnqnRmG}xyt=)2o%<9jj>-4wLP1X-bI{(n zD9#|rN#J;G%LJ&$+Gl2eTRPx6BQC6Uc~YK?nMmktvy^E8#Y*6ZJVZ>Y(cgsVnd!tV z!%twMNznd)?}YCWyy1-#P|2Fu%~}hcTGoy>_uawRTVl=(xo5!%F#A38L109wyh@wm zdy+S8E_&$Gjm=7va-b7@Hv=*sNo0{i8B7=n4ex-mfg`$!n#)v@xxyQCr3m&O1Jxg! z+FXX^jtlw=utuQ+>Yj$`9!E<5-c!|FX(~q`mvt6i*K!L(MHaqZBTtuSA9V~V9Q$G? zC8wAV|#XY=;TQD#H;;dcHVb9I7Vu2nI0hHo)!_{qIa@|2}9d ztpC*Q{4Py~2;~6URN^4FBCBip`QDf|O_Y%iZyA0R`^MQf$ce0JuaV(_=YA`knEMXw zP6TbjYSGXi#B4eX=QiWqb3bEw-N*a;Yg?dsVPpeYFS*&AsqtW1j2D$h$*ZOdEb$8n0 zGET4Igs^cMTXWG{2#A7w_usx=KMmNfi4oAk8!MA8Y=Rh9^*r>jEV(-{I0=rc);`Y) zm+6KHz-;MIy|@2todN&F+Yv1e&b&ZvycbTHpDoZ>FIiUn+M-=%A2C(I*^Yx@VKf(Z zxJOny&WoWcyKodkeN^5))aV|-UBFw{?AGo?;NNFFcKzk+6|gYfA#FR=y@?;3IoQ zUMI=7lwo9gV9fRvYi}Nd)&gQw7(K3=a0#p27u6Q)7JlP#A)piUUF8B3Li&38Xk$@| z9OR+tU~qgd3T3322E))eV)hAAHYIj$TmhH#R+C-&E-}5Qd{3B}gD{MXnsrS;{Erv1 z6IyQ=S2qD>Weqqj#Pd65rDSdK54%boN+a?=CkR|agnIP6;INm0A*4gF;G4PlA^3%b zN{H%#wYu|!3fl*UL1~f+Iu|;cqDax?DBkZWSUQodSDL4Es@u6zA>sIm>^Aq-&X#X8 zI=#-ucD|iAodfOIY4AaBL$cFO@s(xJ#&_@ZbtU+jjSAW^g;_w`FK%aH_hAY=!MTjI zwh_OEJ_25zTQv$#9&u0A11x_cGd92E74AbOrD`~f6Ir9ENNQAV2_J2Ig~mHWhaO5a zc>fYG$zke^S+fBupw+klDkiljJAha z6DnTemhkf>hv`8J*W_#wBj-2w(cVtXbkWWtE(3j@!A-IfF?`r$MhVknTs3D1N`rYN zKth9jZtX#>v#%U@^DVN!;ni#n1)U&H_uB{6pcq7$TqXJX!Q0P7U*JUZyclb~)l*DS zOLpoQfW_3;a0S$#V0SOwVeeqE$Hd^L`$;l_~2giLYd?7!gUYIpOs!jqSL~pI)4`YuB_692~A z^T#YYQ_W3Rakk}$SL&{`H8mc{>j+3eKprw6BK`$vSSIn;s31M~YlJLApJ)+Gi1{^- zw96WnT9M0Vr_D=e=a}${raR{(35Q!g+8`}vOFj1e&Or(_wp2U2aVQP0_jP57 z2(R4E(E$n!xl<}Zx38wO;27wuQ`P#_j!}L2 z2qr;As4D4n2X$-Jd_-!fsbu_D(64i;c4cJnP576x_>Q4WNushFwkBV!kVd(AYFXe{ zaqO5`Qfr!#ETmE(B;u_&FITotv~W}QYFCI!&ENKIb1p4fg*Yv1)EDMb==EjHHWM#{ zGMpqb2-LXdHB@D~pE3|+B392Gh4q)y9jBd$a^&cJM60VEUnLtHQD5i-X6PVF>9m_k zDvG3P(?CzdaIrC8s4cu~N9MEb!Tt(g*GK~gIp1Gyeaw3b7#YPx_1T6i zRi#pAMr~PJKe9P~I+ARa$a!K~)t(4LaVbjva1yd;b1Yz2$7MMc`aLmMl(a^DgN(u? zq2o9&Gif@Tq~Yq+qDfx^F*nCnpuPv%hRFc$I!p74*quLt^M}D_rwl10uMTr!)(*=7 zSC5ea@#;l(h87k4T4x)(o^#l76P-GYJA(pOa&F9YT=fS<*O{4agzba^dIrh0hjls<~APlIz9{ zgRY{OMv2s|`;VCoYVj?InYoq^QWuA&*VDyOn@pPvK8l~g#1~~MGVVvtLDt}>id_Z` zn(ihfL?Y}Y4YX335m*Xx(y+bbukchHrM zycIGp#1*K3$!(tgTsMD2VyUSg^yvCwB8*V~sACE(yq2!MS6f+gsxv^GR|Q7R_euYx z&X+@@H?_oQddGxJYS&ZG-9O(X+l{wcw;W7srpYjZZvanY(>Q1utSiyuuonkjh5J0q zGz6`&meSuxixIPt{UoHVupUbFKIA+3V5(?ijn}(C(v>=v?L*lJF8|yRjl-m#^|krg zLVbFV6+VkoEGNz6he;EkP!Z6|a@n8?yCzX9>FEzLnp21JpU0x!Qee}lwVKA})LZJq zlI|C??|;gZ8#fC3`gzDU%7R87KZyd)H__0c^T^$zo@TBKTP*i{)Gp3E0TZ}s3mKSY zix@atp^j#QnSc5K&LsU38#{lUdwj%xF zcx&l^?95uq9on1m*0gp$ruu||5MQo)XaN>|ngV5Jb#^wWH^5AdYcn_1>H~XtNwJd3 zd9&?orMSSuj=lhO?6)Ay7;gdU#E}pTBa5wFu`nejq##Xd71BHzH2XqLA5 zeLEo;9$}~u0pEu@(?hXB_l;{jQ=7m?~mwj-ME~Tw-OHPrR7K2Xq9eCNwQO$hR z3_A?=`FJctNXA#yQEorVoh{RWxJbdQga zU%K##XEPgy?E|K(=o#IPgnbk7E&5%J=VHube|2%!Qp}@LznjE%VQhJ?L(XJOmFVY~ zo-az+^5!Ck7Lo<7b~XC6JFk>17*_dY;=z!<0eSdFD2L?CSp_XB+?;N+(5;@=_Ss3& zXse>@sA7hpq;IAeIp3hTe9^$DVYf&?)={zc9*hZAV)|UgKoD!1w{UVo8D)Htwi8*P z%#NAn+8sd@b{h=O)dy9EGKbpyDtl@NBZw0}+Wd=@65JyQ2QgU}q2ii;ot1OsAj zUI&+Pz+NvuRv#8ugesT<<@l4L$zso0AQMh{we$tkeG*mpLmOTiy8|dNYhsqhp+q*yfZA`Z)UC*(oxTNPfOFk3RXkbzAEPofVUy zZ3A%mO?WyTRh@WdXz+zD!ogo}gbUMV!YtTNhr zrt@3PcP%5F;_SQ>Ui`Gq-lUe&taU4*h2)6RDh@8G1$o!){k~3)DT87%tQeHYdO?B` zAmoJvG6wWS?=0(Cj?Aqj59`p(SIEvYyPGJ^reI z`Hr?3#U2zI7k0=UmqMD35l`>3xMcWlDv$oo6;b`dZq3d!~)W z=4Qk)lE8&>#HV>?kRLOHZYz83{u7?^KoXmM^pazj8`7OwQ=5I!==; zA!uN`Q#n=Drmzg}@^nG!mJp9ml3ukWk96^6*us*;&>s+7hWfLXtl?a}(|-#=P12>A zon1}yqh^?9!;on?tRd6Fk0knQSLl4vBGb87A_kJNDGyrnpmn48lz_%P{* z_G*3D#IR<2SS54L5^h*%=)4D9NPpji7DZ5&lHD|99W86QN_(|aJ<5C~PX%YB`Qt_W z>jF_Os@kI6R!ub4n-!orS(G6~mKL7()1g=Lf~{D!LR7#wRHfLxTjYr{*c{neyhz#U zbm@WBKozE+kTd+h-mgF+ELWqTKin57P;0b){ zii5=(B%S(N!Z=rAFGnM6iePtvpxB_Q9-oq_xH!URn2_d-H~i;lro8r{-g!k-Ydb6_w5K@FOV?zPF_hi z%rlxBv$lQi%bjsu^7KT~@u#*c$2-;AkuP)hVEN?W5MO8C9snj*EC&|M!aK6o12q3+ z8e?+dH17E!A$tRlbJW~GtMDkMPT=m1g-v67q{sznnWOI$`g(8E!Pf!#KpO?FETxLK z2b^8^@mE#AR1z(DT~R3!nnvq}LG2zDGoE1URR=A2SA z%lN$#V@#E&ip_KZL}Q6mvm(dsS?oHoRf8TWL~1)4^5<3JvvVbEsQqSa3(lF*_mA$g zv`LWarC79G)zR0J+#=6kB`SgjQZ2460W zN%lZt%M@=EN>Wz4I;eH>C0VnDyFe)DBS_2{h6=0ZJ*w%s)QFxLq+%L%e~UQ0mM9ud zm&|r){_<*Om%vlT(K9>dE(3AHjSYro5Y1I?ZjMqWyHzuCE0nyCn`6eq%MEt(aY=M2rIzHeMds)4^Aub^iTIT|%*izG4YH;sT`D9MR(eND-SB+e66LZT z2VX)RJsn${O{D48aUBl|(>ocol$1@glsxisc#GE*=DXHXA?|hJT#{;X{i$XibrA}X zFHJa+ssa2$F_UC(o2k2Z0vwx%Wb(<6_bdDO#=a$0gK2NoscCr;vyx?#cF)JjM%;a| z$^GIlIzvz%Hx3WVU481}_e4~aWcyC|j&BZ@uWW1`bH1y9EWXOxd~f-VE5DpueNofN zv7vZeV<*!A^|36hUE;`#x%MHhL(~?eZ5fhA9Ql3KHTWoAeO-^7&|2)$IcD1r5X#-u zN~N0$6pHPhop@t1_d`dO3#TC0>y5jm>8;$F5_A2& zt#=^IDfYv?JjPPTPNx2TL-Lrl82VClQSLWW_$3=XPbH}xM34)cyW5@lnxy=&h%eRq zv29&h^fMoxjsDnmua(>~OnX{Cq!7vM0M4Mr@_18|YuSKPBKUTV$s^So zc}JlAW&bVz|JY#Eyup6Ny{|P_s0Pq;5*tinH+>5Xa--{ z2;?2PBs((S4{g=G`S?B3Ien`o#5DmUVwzpGuABthYG~OKIY`2ms;33SN9u^I8i_H5`BQ%yOfW+N3r|ufHS_;U;TWT5z;b14n1gX%Pn`uuO z6#>Vl)L0*8yl|#mICWQUtgzeFp9$puHl~m&O+vj3Ox#SxQUa?fY*uK?A;00RiFg(G zK?g=7b5~U4QIK`C*um%=Sw=OJ1eeaV@WZ%hh-3<=lR#(Xesk%?)l4p(EpTwPvN99V@TT)!A8SeFTV+frN=r|5l?K#odjijx2nFgc3kI zC$hVs1S-!z9>xn9MZcRk0YXdYlf~8*LfH$IHKD59H&gLz%6 z#mAYSRJufbRi~LRadwM*G!O2>&U<^d`@<)otXZJJxT@G}4kTx0zPDVhVXwiU)$}5Y z`0iV`8EEh&GlUk&VY9m0Mqr*U&|^Bc?FB`<%{x-o0ATntwIA%(YDcxWs$C)%a%d_@ z?fx!Co+@3p7ha$|pWYD}p6#(PG%_h8K7sQjT_P~|3ZEH0DRxa3~bP&&lPMj3C~!H2QD zq>(f^RUFSqf6K3BMBFy$jiuoSE+DhEq$xLDb7{57 z0B|1pSjYJ5F@cHG%qDZ{ogL$P!BK&sR%zD`gbK#9gRZX17EtAJxN% zys^gb2=X9=7HP}N(iRqt(tot2yyeE%s;L}AcMh;~-W~s_eAe!gIUYdQz5j~T)0trh z>#1U$uOyyl%!Pi(gD&)uHe9Q^27_kHyFCC}n^-KL(=OxHqUfex1YS__RJh0m-S>eM zqAk`aSev*z1lI&-?CycgDm=bdQCp}RqS0_d-4Mf&>u2KyGFxKe8JM1N{GNWw0n$FL z1UDp(h0(1I2Jh9I`?IS}h4R~n zRwRz>8?$fFMB2{UPe^$Ifl;Oc>}@Q9`|8DCeR{?LUQLPfaMsxs8ps=D_aAXORZH~< zdcIOca-F;+D3~M+)Vi4h)I4O3<)$65yI)goQ_vk#fb;Uim>UI4Dv9#2b1;N_Wg>-F zNwKeMKY+su#~NL0uE%_$mw1%ddX2Qs2P!ncM+>wnz}OCQX1!q~oS?OqYU;&ESAAwP z452QWL0&u^mraF#=j_ZeBWhm&F|d!QjwRl^7=Bl7@(43=BkN=3{BRv#QHIk>Umc_w zvP>q|q{lJ=zs|W9%a@8%W>C@MYN1D5{(=Af31+pR#kB`cd0-YlQQTg}+ zL|_h=F9JQ|Gux5c0ehaffHNYLf8VwF+qnM6IjBEI_eceee;o;FY@#~FFVsZjBSp!j z8V*Bgmn{RK!!zqGc;jy)z@Zjo>5{%m1?K}fLEL$l6Dl4f=ye0wNI#)2L=^K(&18Gb zJoj8@WBB;P^T#V)I0`aDSy?$rJU{+-5472NyFp>;Vw43j@3Z=;D2eSfyw5*0Q+&ML zsV&&*3c3$pa`qcaGbEB0*CA~Wp3%PkF?B87FV&rWNb|@GU$LB;l|;YutU*k za1hjUL_BX%G^s;BuzRi4Hl?eqC2z&ZrKh1tZDwnufG$g$LX(j!h%F5(n8D@in3lnX z(*8+3ZT6TVYRcSpM1eMeCps=Fz8q%gyM&B=a7(Vf`4k3dN$IM+`BO^_7HZq4BR|7w z+5kOJ;9_$X%-~arA@qmXSzD|+NMh--%5-9u6t(M=f%&z$<_V#Y_lzn{E$MZZG)+A> zu2E`_Y(MBJ2l*AqvCUmU;yBT}#oQ{V=((mC-QGJwsCOH*a;{1JRTKv7DBNG+M!XL7(^jbv&Qy-o9HNFrmN)-`D3WFtXs>1vBOJpI(=x; zKhJlFdfMf^G#oU(w1+ucMKYPZaDp>$kt=wiYsBCjUY-uz<4JziB>6fXDSLH*2Y z&Px5y`#3!fF=c4>fCMdg-tX582pemU@ZxyFbznL8-=TTo1Sybg9>7h*J^9^~XxXJO z`k9v~=4amxl<;FCV9h2k%?^-ZUzQy^#{JleyH23o1S{r<+t#z6jKS<9rbAM96^1iY zi6{IjauB)UwBhC-_L(MzGCxhhv`?ryc zja_Uwi7$8l!}*vjJppGyp#Wz=*?;jC*xQ&J894rql5A$2giJRtV&DWQh#(+Vs3-5_ z69_tj(>8%z1VtVp>a74r5}j2rG%&;uaTQ|fr&r%ew-HO}76i8`&ki%#)~}q4Y|d$_ zfNp9uc#$#OEca>>MaY6rF`dB|5#S)bghf>>TmmE&S~IFw;PF0UztO6+R-0!TSC?QP z{b(RA_;q3QAPW^XN?qQqu{h<}Vfiv}Rr!lA$C79^1=U>+ng9Dh>v{`?AOZt>CrQ=o zI}=mSnR))8fJpO->rcX?H);oqSQUZ?sR!fH2SoFdcPm5*2y<_u;4h;BqcF*XbwWSv zcJN%!g|L(22Xp!^1?c;T&qm%rpkP&2EQC3JF+SENm$+@7#e!UKD1uQ{TDw43?!b!3 zUooS_rt=xJfa&h?c^hfV>YwQXre3qosz_^c#)FO~d!<)2o}Oxz5HWtr<)1Yw012v4 zhv0w(RfJspDnA^-6Jmr;GkWt%{mAYOm6yPb&Vl&rv@D^K&;#?=X{kaK5FhScNJ_3> z#5u(Saisq2(~pVlrfG#@kLM#Ot~5rZZc%B&h1=gen?R+#t^1bYKf zVvtefX=D$*)39e^2@!~A_}9c${Gf0?1;dk=!Itp#s%0>Io%k`9(bDeI-udd&E6Zfu zcaiv(h`DM3W3Mfda)fYwhB=8RAPkotVt5-z21Ij~Ot9A^SK-1u*zFVK&mF?q1;|wy zrF+XWs^5Q-%Z6I62gTwrRe#F>riVM#fv_TihxSJ6to1X7NVszgivoTa!fPfBBYj94 zuc2m zL_k-<1FoORng1aL{Zx(P7JmUiH zlmTHdzkn75=mS{V=o$V;gzhEaunoJzJ3uq>0_w~77eID^U*w+v0po_N8=sS-DL~!V z%-~rL<0V7PCEWPCpNgpfsein`Fr)+8=N}mUn2x=K`z%efnhSs#23&N1fjdO`M>s%z zP3(;v93%lLq>ZfqBi#QI-aCXAP8-may8x5s`G)KA;{HSYe2szWINWf^b*fc{jl0KecD zRTle?)%_YzJJcVb>;VJ>P?3Lu2S)vCJZlF>Jxj~~X2U5-NNNy(H?8%XD~yFUxNKs&hwWx^)iF@ zGmEv<|7Q7hGrY_+`iz+d_=^9c(_c}UCzq2#%A0|5WjzCXjZUOxOX zU&-^smw$iwKPe;r`&{rP{L35^&+wk6f2-Sn;D2Ww@sjAJj{Gwbp4H!o{#5_}qALFq z{-q%LGklZvKf%A4D!+t%sRRBDi(>mvuz&V4yu^GdD*KFy?fg%ef5ZU%w=d&M`POGt zNSEJ0{qJI~FRTAjlJc1-+x>Tm{%D?m3sk-&cq#w)OpxI98wCF#2KbWcrAXK_(}M4B zF#VQf*h|irx=+uXZUMi+`A;fPFR5M%Wjs^Wh5rWCKgedhWO^w|@XS;b^&3oom;>K0 zB??|ry^IBarYem6Z7RU`#rDs-ZZAn*hSollv?csD$sh0QpTtI9vb>Dpd}e7*`fZj! zM|8d{~YM@vfW-r0z8vJ z<^6B6Ur(}L?ms_c9@hO0^Iy&J_uc51^?d33e#Y!-``?)VG)BGjCq5$&0G8A*r!2qk zUHscGc;VxE=1KqbH=dW%&Ogl({>L!>((m$2W8M9KQ@a1=h51jN|KoG{v(x0K&*iy% e1c3cF4~(n?C}6GmGu)3JNC)6=LGAhZ*Z%`+-T+_# diff --git a/jGui/gradle/wrapper/gradle-wrapper.properties b/jGui/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 0d4bfd50..00000000 --- a/jGui/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionSha256Sum=fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.8-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/jGui/gradlew b/jGui/gradlew deleted file mode 100755 index cccdd3d5..00000000 --- a/jGui/gradlew +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env sh - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/jGui/gradlew.bat b/jGui/gradlew.bat deleted file mode 100644 index f9553162..00000000 --- a/jGui/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/jGui/preprocess.gradle.kts b/jGui/preprocess.gradle.kts deleted file mode 100644 index d8df4713..00000000 --- a/jGui/preprocess.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -import com.replaymod.gradle.preprocess.RootPreprocessExtension - -plugins { - id("com.replaymod.preprocess") apply false -} - -project.extensions.create("preprocess", RootPreprocessExtension::class) -configure { - "1.16.4"(11604, "yarn") { - "1.16.1"(11601, "yarn") { - "1.15.2"(11502, "yarn") { - "1.14.4"(11404, "yarn", file("versions/mapping-fabric-1.15.2-1.14.4.txt")) { - } - } - } - "1.16.4-forge"(11604, "srg", file("versions/mapping-1.16.4-fabric-forge.txt")) { - "1.12"(11200, "srg", file("versions/1.14.4-forge/mapping.txt")) { - "1.9.4"(10904, "srg", file("versions/1.12/mapping.txt")) { - "1.8.9"(10809, "srg", file("versions/1.9.4/mapping.txt")) { - "1.8"(10800, "srg") { - "1.7.10"(10710, "srg", file("versions/1.8/mapping.txt")) - } - } - } - } - } - } -} diff --git a/jGui/root.gradle.kts b/jGui/root.gradle.kts deleted file mode 100644 index 6bced442..00000000 --- a/jGui/root.gradle.kts +++ /dev/null @@ -1,41 +0,0 @@ -plugins { - id("fabric-loom") version "0.6-SNAPSHOT" apply false - id("com.replaymod.preprocess") version "7c4f90e" - id("com.github.hierynomus.license") version "0.15.0" -} - -group = "de.johni0702.minecraft" -version = "git" - -license { - extra.set("name", "jGui API") - extra.set("author", "johni0702") - extra.set("url", "https://github.com/johni0702") - extra.set("year", "2016") - header = File(project.getProjectDir(), "HEADER.txt") - ignoreFailures = false - strictCheck = true - mapping("java", "SLASHSTAR_STYLE") -} - -preprocess { - "1.16.4"(11604, "yarn") { - "1.16.1"(11601, "yarn") { - "1.15.2"(11502, "yarn") { - "1.14.4"(11404, "yarn", file("versions/mapping-fabric-1.15.2-1.14.4.txt")) { - } - } - } - "1.16.4-forge"(11604, "srg", file("versions/mapping-1.16.4-fabric-forge.txt")) { - "1.12"(11200, "srg", file("versions/1.14.4-forge/mapping.txt")) { - "1.9.4"(10904, "srg", file("versions/1.12/mapping.txt")) { - "1.8.9"(10809, "srg", file("versions/1.9.4/mapping.txt")) { - "1.8"(10800, "srg") { - "1.7.10"(10710, "srg", file("versions/1.8/mapping.txt")) - } - } - } - } - } - } -} diff --git a/jGui/settings.gradle.kts b/jGui/settings.gradle.kts deleted file mode 100644 index 857f9ad3..00000000 --- a/jGui/settings.gradle.kts +++ /dev/null @@ -1,42 +0,0 @@ -pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - mavenCentral() - google() - maven("https://jitpack.io") - maven("https://maven.fabricmc.net") - } - resolutionStrategy { - eachPlugin { - when (requested.id.id) { - "com.replaymod.preprocess" -> { - useModule("com.github.replaymod:preprocessor:${requested.version}") - } - } - } - } -} - -rootProject.name = "jGui" -rootProject.buildFileName = "root.gradle.kts" - -listOf( - "1.7.10", - "1.8", - "1.8.9", - "1.9.4", - "1.12", - "1.14.4", - "1.15.2", - "1.16.1", - "1.16.4-forge", - "1.16.4" -).forEach { version -> - include(":$version") - project(":$version").apply { - projectDir = file("versions/$version") - buildFileName = "../../build.gradle" - } -} - diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/GuiRenderer.java b/jGui/src/main/java/de/johni0702/minecraft/gui/GuiRenderer.java deleted file mode 100644 index cbec3992..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/GuiRenderer.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui; - -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; - -public interface GuiRenderer { - - ReadablePoint getOpenGlOffset(); - - MatrixStack getMatrixStack(); - - ReadableDimension getSize(); - - void setDrawingArea(int x, int y, int width, int height); - - void bindTexture(Identifier location); - - void bindTexture(int glId); - - void drawTexturedRect(int x, int y, int u, int v, int width, int height); - - void drawTexturedRect(int x, int y, int u, int v, int width, int height, int uWidth, int vHeight, int textureWidth, int textureHeight); - - void drawRect(int x, int y, int width, int height, int color); - - void drawRect(int x, int y, int width, int height, ReadableColor color); - - void drawRect(int x, int y, int width, int height, int topLeftColor, int topRightColor, int bottomLeftColor, int bottomRightColor); - - void drawRect(int x, int y, int width, int height, ReadableColor topLeftColor, ReadableColor topRightColor, ReadableColor bottomLeftColor, ReadableColor bottomRightColor); - - int drawString(int x, int y, int color, String text); - - int drawString(int x, int y, ReadableColor color, String text); - - int drawCenteredString(int x, int y, int color, String text); - - int drawCenteredString(int x, int y, ReadableColor color, String text); - - int drawString(int x, int y, int color, String text, boolean shadow); - - int drawString(int x, int y, ReadableColor color, String text, boolean shadow); - - int drawCenteredString(int x, int y, int color, String text, boolean shadow); - - int drawCenteredString(int x, int y, ReadableColor color, String text, boolean shadow); - - /** - * Inverts all colors on the screen. - * @param right Right border of the inverted rectangle - * @param bottom Bottom border of the inverted rectangle - * @param left Left border of the inverted rectangle - * @param top Top border of the inverted rectangle - */ - void invertColors(int right, int bottom, int left, int top); - -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/MinecraftGuiRenderer.java b/jGui/src/main/java/de/johni0702/minecraft/gui/MinecraftGuiRenderer.java deleted file mode 100644 index bf6ef67b..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/MinecraftGuiRenderer.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui; - -import de.johni0702.minecraft.gui.utils.NonNull; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawableHelper; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -import org.lwjgl.opengl.GL11; - -//#if MC>=10800 -import com.mojang.blaze3d.platform.GlStateManager; -import static com.mojang.blaze3d.platform.GlStateManager.*; -//#else -//$$ import net.minecraft.client.renderer.OpenGlHelper; -//$$ import static de.johni0702.minecraft.gui.versions.MCVer.*; -//#endif - -import static de.johni0702.minecraft.gui.versions.MCVer.*; -import static org.lwjgl.opengl.GL11.*; - -public class MinecraftGuiRenderer implements GuiRenderer { - - private final DrawableHelper gui = new DrawableHelper(){}; - private final MinecraftClient mc = getMinecraft(); - - private final MatrixStack matrixStack; - - @NonNull - //#if MC>=11400 - private final int scaledWidth = newScaledResolution(mc).getScaledWidth(); - private final int scaledHeight = newScaledResolution(mc).getScaledHeight(); - private final double scaleFactor = newScaledResolution(mc).getScaleFactor(); - //#else - //$$ private final int scaledWidth = newScaledResolution(mc).getScaledWidth(); - //$$ private final int scaledHeight = newScaledResolution(mc).getScaledHeight(); - //$$ private final double scaleFactor = newScaledResolution(mc).getScaleFactor(); - //#endif - - public MinecraftGuiRenderer(MatrixStack matrixStack) { - this.matrixStack = matrixStack; - } - - @Override - public ReadablePoint getOpenGlOffset() { - return new Point(0, 0); - } - - @Override - public MatrixStack getMatrixStack() { - return matrixStack; - } - - @Override - public ReadableDimension getSize() { - return new ReadableDimension() { - @Override - public int getWidth() { - return scaledWidth; - } - - @Override - public int getHeight() { - return scaledHeight; - } - - @Override - public void getSize(WritableDimension dest) { - dest.setSize(getWidth(), getHeight()); - } - }; - } - - @Override - public void setDrawingArea(int x, int y, int width, int height) { - // glScissor origin is bottom left corner whereas otherwise it's top left - y = scaledHeight - y - height; - - int f = (int) scaleFactor; - GL11.glScissor(x * f, y * f, width * f, height * f); - } - - @Override - public void bindTexture(Identifier location) { - //#if MC>=11500 - MCVer.getMinecraft().getTextureManager().bindTexture(location); - //#else - //$$ MCVer.getMinecraft().getTextureManager().bindTexture(location); - //#endif - } - - @Override - public void bindTexture(int glId) { - //#if MC>=10800 - GlStateManager.bindTexture(glId); - //#else - //$$ GL11.glBindTexture(GL_TEXTURE_2D, glId); - //#endif - } - - @Override - public void drawTexturedRect(int x, int y, int u, int v, int width, int height) { - //#if MC>=11600 - gui.drawTexture(matrixStack, x, y, u, v, width, height); - //#else - //#if MC>=11400 - //$$ gui.blit(x, y, u, v, width, height); - //#else - //$$ gui.drawTexturedModalRect(x, y, u, v, width, height); - //#endif - //#endif - } - - @Override - public void drawTexturedRect(int x, int y, int u, int v, int width, int height, int uWidth, int vHeight, int textureWidth, int textureHeight) { - color(1, 1, 1); - //#if MC>=11600 - DrawableHelper.drawTexture(matrixStack, x, y, width, height, u, v, uWidth, vHeight, textureWidth, textureHeight); - //#else - //#if MC>=11400 - //$$ DrawableHelper.blit(x, y, width, height, u, v, uWidth, vHeight, textureWidth, textureHeight); - //#else - //$$ Gui.drawScaledCustomSizeModalRect(x, y, u, v, uWidth, vHeight, width, height, textureWidth, textureHeight); - //#endif - //#endif - } - - @Override - public void drawRect(int x, int y, int width, int height, int color) { - DrawableHelper.fill( - //#if MC>=11600 - matrixStack, - //#endif - x, y, x + width, y + height, color); - color(1, 1, 1); - enableBlend(); - } - - @Override - public void drawRect(int x, int y, int width, int height, ReadableColor color) { - drawRect(x, y, width, height, color(color)); - } - - @Override - public void drawRect(int x, int y, int width, int height, int topLeftColor, int topRightColor, int bottomLeftColor, int bottomRightColor) { - drawRect(x, y, width, height, color(topLeftColor), color(topRightColor), color(bottomLeftColor), color(bottomRightColor)); - } - - @Override - public void drawRect(int x, int y, int width, int height, ReadableColor tl, ReadableColor tr, ReadableColor bl, ReadableColor br) { - disableTexture(); - enableBlend(); - disableAlphaTest(); - blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0); - shadeModel(GL_SMOOTH); - MCVer.drawRect(x, y, width, height, tl, tr, bl, br); - shadeModel(GL_FLAT); - enableAlphaTest(); - enableTexture(); - } - - @Override - public int drawString(int x, int y, int color, String text) { - return drawString(x, y, color, text, false); - } - - @Override - public int drawString(int x, int y, ReadableColor color, String text) { - return drawString(x, y, color(color), text); - } - - @Override - public int drawCenteredString(int x, int y, int color, String text) { - return drawCenteredString(x, y, color, text, false); - } - - @Override - public int drawCenteredString(int x, int y, ReadableColor color, String text) { - return drawCenteredString(x, y, color(color), text); - } - - @Override - public int drawString(int x, int y, int color, String text, boolean shadow) { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - try { - if (shadow) { - return fontRenderer.drawWithShadow( - //#if MC>=11600 - matrixStack, - //#endif - text, x, y, color); - } else { - return fontRenderer.draw( - //#if MC>=11600 - matrixStack, - //#endif - text, x, y, color); - } - } finally { - color(1, 1, 1); - } - } - - @Override - public int drawString(int x, int y, ReadableColor color, String text, boolean shadow) { - return drawString(x, y, color(color), text, shadow); - } - - @Override - public int drawCenteredString(int x, int y, int color, String text, boolean shadow) { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - x-=fontRenderer.getWidth(text) / 2; - return drawString(x, y, color, text, shadow); - } - - @Override - public int drawCenteredString(int x, int y, ReadableColor color, String text, boolean shadow) { - return drawCenteredString(x, y, color(color), text, shadow); - } - - private int color(ReadableColor color) { - return color.getAlpha() << 24 - | color.getRed() << 16 - | color.getGreen() << 8 - | color.getBlue(); - } - - private ReadableColor color(int color) { - return new Color((color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff, (color >> 24) & 0xff); - } - - private void color(int r, int g, int b) { - //#if MC>=10800 - //#if MC>=11400 - GlStateManager.color4f(r, g, b, 1); - //#else - //$$ GlStateManager.color(r, g, b); - //#endif - //#else - //$$ MCVer.color(r, g, b); - //#endif - } - - @Override - public void invertColors(int right, int bottom, int left, int top) { - if (left >= right || top >= bottom) return; - - color(0, 0, 1); - disableTexture(); - enableColorLogicOp(); - logicOp(GL11.GL_OR_REVERSE); - - MCVer.drawRect(right, bottom, left, top); - - disableColorLogicOp(); - enableTexture(); - color(1, 1, 1); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/OffsetGuiRenderer.java b/jGui/src/main/java/de/johni0702/minecraft/gui/OffsetGuiRenderer.java deleted file mode 100644 index db652a95..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/OffsetGuiRenderer.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui; - -import de.johni0702.minecraft.gui.utils.NonNull; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -import org.lwjgl.opengl.GL11; - -public class OffsetGuiRenderer implements GuiRenderer { - - @NonNull - private final GuiRenderer renderer; - - @NonNull - private final ReadablePoint position; - - @NonNull - private final ReadableDimension size; - - private final boolean strict; - - /** - * Creates a new strict offset jgui renderer with the same settings as the supplied one. - * @see #OffsetGuiRenderer(GuiRenderer, ReadablePoint, ReadableDimension, boolean) - * @param renderer The renderer to copy from - */ - public OffsetGuiRenderer(OffsetGuiRenderer renderer) { - this(renderer.renderer, renderer.position, renderer.size, true); - } - - /** - * Create a new offset GUI renderer. All calls to this renderer are forwarded to the parent - * renderer with coordinates offset by the specified position. - * This also ensures that drawing happens within the specified bounds. - * @param renderer The parent renderer - * @param position The position of this renderer within the parent (used as is, not copied) - * @param size The size of the drawable area (used as is, not copied) - */ - public OffsetGuiRenderer(GuiRenderer renderer, ReadablePoint position, ReadableDimension size) { - this(renderer, position, size, true); - } - - - /** - * Create a new offset GUI renderer. All calls to this renderer are forwarded to the parent - * renderer with coordinates offset by the specified position. - * If strict is {@code true}, this also ensures that drawing happens within the specified bounds. - * @param renderer The parent renderer - * @param position The position of this renderer within the parent (used as is, not copied) - * @param size The size of the drawable area (used as is, not copied) - * @param strict Whether drawing should be forced to be within the drawable area - */ - public OffsetGuiRenderer(GuiRenderer renderer, ReadablePoint position, ReadableDimension size, boolean strict) { - this.renderer = renderer; - this.position = position; - this.size = size; - this.strict = strict; - } - - @Override - public ReadablePoint getOpenGlOffset() { - ReadablePoint parentOffset = renderer.getOpenGlOffset(); - return new Point(parentOffset.getX() + position.getX(), parentOffset.getY() + position.getY()); - } - - @Override - public MatrixStack getMatrixStack() { - return renderer.getMatrixStack(); - } - - @Override - public ReadableDimension getSize() { - return size; - } - - @Override - public void setDrawingArea(int x, int y, int width, int height) { - if (!strict) { - renderer.setDrawingArea(x + position.getX(), y + position.getY(), width, height); - return; - } - int x2 = x + width; - int y2 = y + height; - // Convert and clamp top and left border - x = Math.max(0, x + position.getX()); - y = Math.max(0, y + position.getY()); - // Clamp and convert bottom and right border - x2 = Math.min(x2, size.getWidth()) + position.getX(); - y2 = Math.min(y2, size.getHeight()) + position.getY(); - // Make sure bottom and top / right and left aren't flipped - x2 = Math.max(x2, x); - y2 = Math.max(y2, y); - // Pass to parent - renderer.setDrawingArea(x, y, x2 - x, y2 - y); - } - - public void startUsing() { - GL11.glPushAttrib(GL11.GL_SCISSOR_BIT); - GL11.glEnable(GL11.GL_SCISSOR_TEST); - setDrawingArea(0, 0, size.getWidth(), size.getHeight()); - } - - public void stopUsing() { - GL11.glPopAttrib(); - } - - @Override - public void bindTexture(Identifier location) { - renderer.bindTexture(location); - } - - @Override - public void bindTexture(int glId) { - renderer.bindTexture(glId); - } - - @Override - public void drawTexturedRect(int x, int y, int u, int v, int width, int height) { - renderer.drawTexturedRect(x + position.getX(), y + position.getY(), u, v, width, height); - } - - @Override - public void drawTexturedRect(int x, int y, int u, int v, int width, int height, int uWidth, int vHeight, int textureWidth, int textureHeight) { - renderer.drawTexturedRect(x + position.getX(), y + position.getY(), u, v, width, height, uWidth, vHeight, textureWidth, textureHeight); - } - - @Override - public void drawRect(int x, int y, int width, int height, int color) { - renderer.drawRect(x + position.getX(), y + position.getY(), width, height, color); - } - - @Override - public void drawRect(int x, int y, int width, int height, ReadableColor color) { - renderer.drawRect(x + position.getX(), y + position.getY(), width, height, color); - } - - @Override - public void drawRect(int x, int y, int width, int height, int topLeftColor, int topRightColor, int bottomLeftColor, int bottomRightColor) { - renderer.drawRect(x + position.getX(), y + position.getY(), width, height, topLeftColor, topRightColor, bottomLeftColor, bottomRightColor); - } - - @Override - public void drawRect(int x, int y, int width, int height, ReadableColor topLeftColor, ReadableColor topRightColor, ReadableColor bottomLeftColor, ReadableColor bottomRightColor) { - renderer.drawRect(x + position.getX(), y + position.getY(), width, height, topLeftColor, topRightColor, bottomLeftColor, bottomRightColor); - } - - @Override - public int drawString(int x, int y, int color, String text) { - return renderer.drawString(x + position.getX(), y + position.getY(), color, text) - position.getX(); - } - - @Override - public int drawString(int x, int y, ReadableColor color, String text) { - return renderer.drawString(x + position.getX(), y + position.getY(), color, text) - position.getX(); - } - - @Override - public int drawCenteredString(int x, int y, int color, String text) { - return renderer.drawCenteredString(x + position.getX(), y + position.getY(), color, text) - position.getX(); - } - - @Override - public int drawCenteredString(int x, int y, ReadableColor color, String text) { - return renderer.drawCenteredString(x + position.getX(), y + position.getY(), color, text) - position.getX(); - } - - @Override - public int drawString(int x, int y, int color, String text, boolean shadow) { - return renderer.drawString(x + position.getX(), y + position.getY(), color, text, shadow) - position.getX(); - } - - @Override - public int drawString(int x, int y, ReadableColor color, String text, boolean shadow) { - return renderer.drawString(x + position.getX(), y + position.getY(), color, text, shadow) - position.getX(); - } - - @Override - public int drawCenteredString(int x, int y, int color, String text, boolean shadow) { - return renderer.drawCenteredString(x + position.getX(), y + position.getY(), color, text, shadow) - position.getX(); - } - - @Override - public int drawCenteredString(int x, int y, ReadableColor color, String text, boolean shadow) { - return renderer.drawCenteredString(x + position.getX(), y + position.getY(), color, text, shadow) - position.getX(); - } - - @Override - public void invertColors(int right, int bottom, int left, int top) { - int x = position.getX(); - int y = position.getY(); - renderer.invertColors(right + x, bottom + y, left + x, top + y); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/RenderInfo.java b/jGui/src/main/java/de/johni0702/minecraft/gui/RenderInfo.java deleted file mode 100644 index 1245afa0..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/RenderInfo.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui; - -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; - -import java.util.Objects; - -public class RenderInfo { - public final float partialTick; - public final int mouseX; - public final int mouseY; - public final int layer; - - public RenderInfo(float partialTick, int mouseX, int mouseY, int layer) { - this.partialTick = partialTick; - this.mouseX = mouseX; - this.mouseY = mouseY; - this.layer = layer; - } - - public RenderInfo offsetMouse(int minusX, int minusY) { - return new RenderInfo(partialTick, mouseX - minusX, mouseY - minusY, layer); - } - - public RenderInfo layer(int layer) { - return this.layer == layer ? this : new RenderInfo(partialTick, mouseX, mouseY, layer); - } - - public void addTo(CrashReport crashReport) { - CrashReportSection category = crashReport.addElement("Render info details"); - MCVer.addDetail(category, "Partial Tick", () -> "" + partialTick); - MCVer.addDetail(category, "Mouse X", () -> "" + mouseX); - MCVer.addDetail(category, "Mouse Y", () -> "" + mouseY); - MCVer.addDetail(category, "Layer", () -> "" + layer); - } - - public float getPartialTick() { - return this.partialTick; - } - - public int getMouseX() { - return this.mouseX; - } - - public int getMouseY() { - return this.mouseY; - } - - public int getLayer() { - return this.layer; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - RenderInfo that = (RenderInfo) o; - return Float.compare(that.partialTick, partialTick) == 0 && - mouseX == that.mouseX && - mouseY == that.mouseY && - layer == that.layer; - } - - @Override - public int hashCode() { - return Objects.hash(partialTick, mouseX, mouseY, layer); - } - - @Override - public String toString() { - return "RenderInfo{" + - "partialTick=" + partialTick + - ", mouseX=" + mouseX + - ", mouseY=" + mouseY + - ", layer=" + layer + - '}'; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiClickableContainer.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiClickableContainer.java deleted file mode 100644 index db3cb73a..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiClickableContainer.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.element.IGuiClickable; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -public abstract class AbstractGuiClickableContainer> - extends AbstractGuiContainer implements Clickable, IGuiClickable { - private Runnable onClick; - - public AbstractGuiClickableContainer() { - } - - public AbstractGuiClickableContainer(GuiContainer container) { - super(container); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - - if (isMouseHovering(pos) && isEnabled()) { - onClick(); - return true; - } - return false; - } - - protected boolean isMouseHovering(ReadablePoint pos) { - return pos.getX() > 0 && pos.getY() > 0 - && pos.getX() < getLastSize().getWidth() && pos.getY() < getLastSize().getHeight(); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - } - - protected void onClick() { - if (onClick != null) { - onClick.run(); - } - } - - @Override - public T onClick(Runnable onClick) { - this.onClick = onClick; - return getThis(); - } - - @Override - public Runnable getOnClick() { - return onClick; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java deleted file mode 100644 index 07c2703c..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiContainer.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.OffsetGuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.element.AbstractComposedGuiElement; -import de.johni0702.minecraft.gui.element.ComposedGuiElement; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.layout.HorizontalLayout; -import de.johni0702.minecraft.gui.layout.Layout; -import de.johni0702.minecraft.gui.layout.LayoutData; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.*; -import java.util.stream.Collectors; - -import static com.google.common.base.Preconditions.checkState; - -public abstract class AbstractGuiContainer> - extends AbstractComposedGuiElement implements GuiContainer { - - private static final Layout DEFAULT_LAYOUT = new HorizontalLayout(); - - private Map elements = new LinkedHashMap<>(); - - private Map> layedOutElements; - - private Layout layout = DEFAULT_LAYOUT; - - private ReadableColor backgroundColor; - - public AbstractGuiContainer() { - } - - public AbstractGuiContainer(GuiContainer container) { - super(container); - } - - @Override - public T setLayout(Layout layout) { - this.layout = layout; - return getThis(); - } - - @Override - public Layout getLayout() { - return layout; - } - - @Override - public void convertFor(GuiElement element, Point point) { - convertFor(element, point, element.getLayer()); - } - - @Override - public void convertFor(GuiElement element, Point point, int relativeLayer) { - if (layedOutElements == null || !layedOutElements.containsKey(element)) { - layout(null, new RenderInfo(0, 0, 0, relativeLayer)); - } - checkState(layedOutElements != null, "Cannot convert position unless rendered at least once."); - Pair pair = layedOutElements.get(element); - checkState(pair != null, "Element " + element + " not part of " + this); - ReadablePoint pos = pair.getKey(); - if (getContainer() != null) { - getContainer().convertFor(this, point, relativeLayer + getLayer()); - } - point.translate(-pos.getX(), -pos.getY()); - } - - @Override - public Collection getChildren() { - return Collections.unmodifiableCollection(elements.keySet()); - } - - @Override - public Map getElements() { - return Collections.unmodifiableMap(elements); - } - - @Override - public T addElements(LayoutData layoutData, GuiElement... elements) { - if (layoutData == null) { - layoutData = LayoutData.NONE; - } - for (GuiElement element : elements) { - this.elements.put(element, layoutData); - element.setContainer(this); - } - return getThis(); - } - - @Override - public T removeElement(GuiElement element) { - if (elements.remove(element) != null) { - element.setContainer(null); - if (layedOutElements != null) { - layedOutElements.remove(element); - } - } - return getThis(); - } - - @Override - public void layout(ReadableDimension size, RenderInfo renderInfo) { - super.layout(size, renderInfo); - if (size == null) return; - try { - layedOutElements = layout.layOut(this, size); - } catch (Exception ex) { - CrashReport crashReport = CrashReport.create(ex, "Gui Layout"); - renderInfo.addTo(crashReport); - CrashReportSection category = crashReport.addElement("Gui container details"); - MCVer.addDetail(category, "Container", this::toString); - MCVer.addDetail(category, "Layout", layout::toString); - throw new CrashException(crashReport); - } - for (final Map.Entry> e : layedOutElements.entrySet()) { - GuiElement element = e.getKey(); - if (element instanceof ComposedGuiElement) { - if (((ComposedGuiElement) element).getMaxLayer() < renderInfo.layer) { - continue; - } - } else { - if (element.getLayer() != renderInfo.layer) { - continue; - } - } - ReadablePoint ePosition = e.getValue().getLeft(); - ReadableDimension eSize = e.getValue().getRight(); - element.layout(eSize, renderInfo.offsetMouse(ePosition.getX(), ePosition.getY()) - .layer(renderInfo.getLayer() - element.getLayer())); - } - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - if (backgroundColor != null && renderInfo.getLayer() == 0) { - renderer.drawRect(0, 0, size.getWidth(), size.getHeight(), backgroundColor); - } - for (final Map.Entry> e : layedOutElements.entrySet()) { - GuiElement element = e.getKey(); - boolean strict; - if (element instanceof ComposedGuiElement) { - if (((ComposedGuiElement) element).getMaxLayer() < renderInfo.layer) { - continue; - } - strict = renderInfo.layer == 0; - } else { - if (element.getLayer() != renderInfo.layer) { - continue; - } - strict = true; - } - final ReadablePoint ePosition = e.getValue().getLeft(); - final ReadableDimension eSize = e.getValue().getRight(); - try { - OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, ePosition, eSize, strict); - eRenderer.startUsing(); - e.getKey().draw(eRenderer, eSize, renderInfo.offsetMouse(ePosition.getX(), ePosition.getY()) - .layer(renderInfo.getLayer() - e.getKey().getLayer())); - eRenderer.stopUsing(); - } catch (Exception ex) { - CrashReport crashReport = CrashReport.create(ex, "Rendering Gui"); - renderInfo.addTo(crashReport); - CrashReportSection category = crashReport.addElement("Gui container details"); - MCVer.addDetail(category, "Container", this::toString); - MCVer.addDetail(category, "Width", () -> "" + size.getWidth()); - MCVer.addDetail(category, "Height", () -> "" + size.getHeight()); - MCVer.addDetail(category, "Layout", layout::toString); - category = crashReport.addElement("Gui element details"); - MCVer.addDetail(category, "Element", () -> e.getKey().toString()); - MCVer.addDetail(category, "Position", ePosition::toString); - MCVer.addDetail(category, "Size", eSize::toString); - if (e.getKey() instanceof GuiContainer) { - MCVer.addDetail(category, "Layout", () -> ((GuiContainer) e.getKey()).getLayout().toString()); - } - throw new CrashException(crashReport); - } - } - } - - @Override - public ReadableDimension calcMinSize() { - return layout.calcMinSize(this); - } - - @Override - public T sortElements() { - sortElements(new Comparator() { - @SuppressWarnings("unchecked") - @Override - public int compare(GuiElement o1, GuiElement o2) { - if (o1 instanceof Comparable && o2 instanceof Comparable) { - return ((Comparable) o1).compareTo(o2); - } - return o1.hashCode() - o2.hashCode(); - } - }); - return getThis(); - } - - @Override - public T sortElements(final Comparator comparator) { - elements = elements.entrySet() - .stream() - .sorted(Map.Entry.comparingByKey(comparator)) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new)); - return getThis(); - } - - @Override - public ReadableColor getBackgroundColor() { - return backgroundColor; - } - - @Override - public T setBackgroundColor(ReadableColor backgroundColor) { - this.backgroundColor = backgroundColor; - return getThis(); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiOverlay.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiOverlay.java deleted file mode 100644 index 7c80d56e..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiOverlay.java +++ /dev/null @@ -1,401 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.MinecraftGuiRenderer; -import de.johni0702.minecraft.gui.OffsetGuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.function.*; -import de.johni0702.minecraft.gui.utils.EventRegistrations; -import de.johni0702.minecraft.gui.utils.MouseUtils; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; -import de.johni0702.minecraft.gui.versions.callbacks.PreTickCallback; -import de.johni0702.minecraft.gui.versions.callbacks.RenderHudCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; - -//#if MC>=11400 -import net.minecraft.text.LiteralText; -//#endif - -//#if MC>=11400 -import net.minecraft.client.util.Window; -//#else -//$$ import org.lwjgl.input.Mouse; -//$$ import net.minecraft.client.gui.ScaledResolution; -//#endif - -//#if MC>=10800 && MC<11400 -//$$ import java.io.IOException; -//#endif - -public abstract class AbstractGuiOverlay> extends AbstractGuiContainer { - - private final UserInputGuiScreen userInputGuiScreen = new UserInputGuiScreen(); - private final EventHandler eventHandler = new EventHandler(); - private boolean visible; - private Dimension screenSize; - private boolean mouseVisible; - private boolean closeable = true; - - public boolean isVisible() { - return visible; - } - - public void setVisible(boolean visible) { - if (this.visible != visible) { - if (visible) { - invokeAll(Loadable.class, Loadable::load); - eventHandler.register(); - } else { - invokeAll(Closeable.class, Closeable::close); - eventHandler.unregister(); - } - updateUserInputGui(); - } - this.visible = visible; - } - - public boolean isMouseVisible() { - return mouseVisible; - } - - public void setMouseVisible(boolean mouseVisible) { - this.mouseVisible = mouseVisible; - updateUserInputGui(); - } - - public boolean isCloseable() { - return closeable; - } - - public void setCloseable(boolean closeable) { - this.closeable = closeable; - } - - /** - * @see #setAllowUserInput(boolean) - */ - public boolean isAllowUserInput() { - return userInputGuiScreen.passEvents; - } - - /** - * Enable/Disable user input for this overlay while the mouse is visible. - * User input are things like moving the player, attacking/interacting, key bindings but not input into the - * GUI elements such as text fields. - * Default for overlays is {@code true} whereas for normal GUI screens it is {@code false}. - * @param allowUserInput {@code true} to allow user input, {@code false} to disallow it - * @see net.minecraft.client.gui.screen.Screen#passEvents - */ - public void setAllowUserInput(boolean allowUserInput) { - userInputGuiScreen.passEvents = allowUserInput; - } - - private void updateUserInputGui() { - MinecraftClient mc = getMinecraft(); - if (visible) { - if (mouseVisible) { - if (mc.currentScreen == null) { - mc.openScreen(userInputGuiScreen); - } - } else { - if (mc.currentScreen == userInputGuiScreen) { - mc.openScreen(null); - } - } - } - } - - @Override - public void layout(ReadableDimension size, RenderInfo renderInfo) { - if (size == null) { - size = screenSize; - } - super.layout(size, renderInfo); - if (mouseVisible && renderInfo.layer == getMaxLayer()) { - final GuiElement tooltip = forEach(GuiElement.class, e -> e.getTooltip(renderInfo)); - if (tooltip != null) { - tooltip.layout(tooltip.getMinSize(), renderInfo); - } - } - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - if (mouseVisible && renderInfo.layer == getMaxLayer()) { - final GuiElement tooltip = forEach(GuiElement.class, e -> e.getTooltip(renderInfo)); - if (tooltip != null) { - final ReadableDimension tooltipSize = tooltip.getMinSize(); - int x, y; - if (renderInfo.mouseX + 8 + tooltipSize.getWidth() < screenSize.getWidth()) { - x = renderInfo.mouseX + 8; - } else { - x = screenSize.getWidth() - tooltipSize.getWidth() - 1; - } - if (renderInfo.mouseY + 8 + tooltipSize.getHeight() < screenSize.getHeight()) { - y = renderInfo.mouseY + 8; - } else { - y = screenSize.getHeight() - tooltipSize.getHeight() - 1; - } - final ReadablePoint position = new Point(x, y); - try { - OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, position, tooltipSize); - tooltip.draw(eRenderer, tooltipSize, renderInfo); - } catch (Exception ex) { - CrashReport crashReport = CrashReport.create(ex, "Rendering Gui Tooltip"); - renderInfo.addTo(crashReport); - CrashReportSection category = crashReport.addElement("Gui container details"); - MCVer.addDetail(category, "Container", this::toString); - MCVer.addDetail(category, "Width", () -> "" + size.getWidth()); - MCVer.addDetail(category, "Height", () -> "" + size.getHeight()); - category = crashReport.addElement("Tooltip details"); - MCVer.addDetail(category, "Element", tooltip::toString); - MCVer.addDetail(category, "Position", position::toString); - MCVer.addDetail(category, "Size", tooltipSize::toString); - throw new CrashException(crashReport); - } - } - } - } - - @Override - public ReadableDimension getMinSize() { - return screenSize; - } - - @Override - public ReadableDimension getMaxSize() { - return screenSize; - } - - private class EventHandler extends EventRegistrations { - private EventHandler() {} - - { on(RenderHudCallback.EVENT, this::renderOverlay); } - private void renderOverlay(MatrixStack stack, float partialTicks) { - updateUserInputGui(); - updateRenderer(); - int layers = getMaxLayer(); - int mouseX = -1, mouseY = -1; - if (mouseVisible) { - Point mouse = MouseUtils.getMousePos(); - mouseX = mouse.getX(); - mouseY = mouse.getY(); - } - RenderInfo renderInfo = new RenderInfo(partialTicks, mouseX, mouseY, 0); - for (int layer = 0; layer <= layers; layer++) { - layout(screenSize, renderInfo.layer(layer)); - } - MinecraftGuiRenderer renderer = new MinecraftGuiRenderer(stack); - for (int layer = 0; layer <= layers; layer++) { - draw(renderer, screenSize, renderInfo.layer(layer)); - } - } - - { on(PreTickCallback.EVENT, () -> invokeAll(Tickable.class, Tickable::tick)); } - - private void updateRenderer() { - MinecraftClient mc = getMinecraft(); - //#if MC>=11400 - Window - //#else - //$$ ScaledResolution - //#endif - res = MCVer.newScaledResolution(mc); - if (screenSize == null - || screenSize.getWidth() != res.getScaledWidth() - || screenSize.getHeight() != res.getScaledHeight()) { - screenSize = new Dimension(res.getScaledWidth(), res.getScaledHeight()); - } - } - } - - protected class UserInputGuiScreen extends net.minecraft.client.gui.screen.Screen { - - //#if MC>=11400 - UserInputGuiScreen() { - super(new LiteralText("")); - } - //#endif - - { - this.passEvents = true; - } - - //#if MC>=11400 - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - Point mousePos = MouseUtils.getMousePos(); - boolean controlDown = hasControlDown(); - boolean shiftDown = hasShiftDown(); - if (!invokeHandlers(Typeable.class, e -> e.typeKey(mousePos, keyCode, '\0', controlDown, shiftDown))) { - return super.keyPressed(keyCode, scanCode, modifiers); - } - return true; - } - - @Override - public boolean charTyped(char keyChar, int modifiers) { - Point mousePos = MouseUtils.getMousePos(); - boolean controlDown = hasControlDown(); - boolean shiftDown = hasShiftDown(); - if (!invokeHandlers(Typeable.class, e -> e.typeKey(mousePos, 0, keyChar, controlDown, shiftDown))) { - return super.charTyped(keyChar, modifiers); - } - return true; - } - //#else - //$$ @Override - //$$ protected void keyTyped(char typedChar, int keyCode) - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //$$ Point mousePos = MouseUtils.getMousePos(); - //$$ boolean controlDown = isCtrlKeyDown(); - //$$ boolean shiftDown = isShiftKeyDown(); - //$$ invokeHandlers(Typeable.class, e -> e.typeKey(mousePos, keyCode, typedChar, controlDown, shiftDown)); - //$$ if (closeable) { - //$$ super.keyTyped(typedChar, keyCode); - //$$ } - //$$ } - //#endif - - @Override - //#if MC>=11400 - public boolean mouseClicked(double mouseXD, double mouseYD, int mouseButton) { - int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); - return - //#else - //$$ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //#endif - invokeHandlers(Clickable.class, e -> e.mouseClick(new Point(mouseX, mouseY), mouseButton)); - } - - @Override - //#if MC>=11400 - public boolean mouseReleased(double mouseXD, double mouseYD, int mouseButton) { - int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); - return - //#else - //$$ protected void mouseReleased(int mouseX, int mouseY, int mouseButton) { - //#endif - invokeHandlers(Draggable.class, e -> e.mouseRelease(new Point(mouseX, mouseY), mouseButton)); - } - - @Override - //#if MC>=11400 - public boolean mouseDragged(double mouseXD, double mouseYD, int mouseButton, double deltaX, double deltaY) { - int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); - long timeSinceLastClick = 0; - return - //#else - //$$ protected void mouseClickMove(int mouseX, int mouseY, int mouseButton, long timeSinceLastClick) { - //#endif - invokeHandlers(Draggable.class, e -> e.mouseDrag(new Point(mouseX, mouseY), mouseButton, timeSinceLastClick)); - } - - @Override - //#if MC>=11400 - public void tick() { - //#else - //$$ public void updateScreen() { - //#endif - invokeAll(Tickable.class, Tickable::tick); - } - - //#if MC>=11400 - @Override - public boolean mouseScrolled( - //#if MC>=11400 - double mouseX, - double mouseY, - //#endif - double dWheel - ) { - //#if MC>=11400 - Point mouse = new Point((int) mouseX, (int) mouseY); - //#else - //$$ Point mouse = MouseUtils.getMousePos(); - //#endif - int wheel = (int) (dWheel * 120); - return invokeHandlers(Scrollable.class, e -> e.scroll(mouse, wheel)); - } - //#else - //$$ @Override - //$$ public void handleMouseInput() - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //$$ super.handleMouseInput(); - //$$ if (Mouse.hasWheel() && Mouse.getEventDWheel() != 0) { - //$$ Point mouse = MouseUtils.getMousePos(); - //$$ int wheel = Mouse.getEventDWheel(); - //$$ invokeHandlers(Scrollable.class, e -> e.scroll(mouse, wheel)); - //$$ } - //$$ } - //#endif - - //#if MC>=11400 - @Override - public void onClose() { - if (closeable) { - super.onClose(); - } - } - //#endif - - @Override - //#if MC>=11400 - public void removed() { - //#else - //$$ public void onGuiClosed() { - //#endif - if (closeable) { - mouseVisible = false; - } - } - - public AbstractGuiOverlay getOverlay() { - return AbstractGuiOverlay.this; - } - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScreen.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScreen.java deleted file mode 100644 index 09615ce8..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScreen.java +++ /dev/null @@ -1,412 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.MinecraftGuiRenderer; -import de.johni0702.minecraft.gui.OffsetGuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.element.GuiLabel; -import de.johni0702.minecraft.gui.function.*; -import de.johni0702.minecraft.gui.utils.MouseUtils; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.util.crash.CrashException; - -//#if MC>=11400 -import de.johni0702.minecraft.gui.versions.MCVer.Keyboard; -//#else -//$$ import org.lwjgl.input.Keyboard; -//$$ import org.lwjgl.input.Mouse; -//#endif - -//#if MC>=10800 -import com.mojang.blaze3d.platform.GlStateManager; - -//#if MC<11400 -//$$ import java.io.IOException; -//#endif -//#endif - -public abstract class AbstractGuiScreen> extends AbstractGuiContainer { - - private final MinecraftGuiScreen wrapped = new MinecraftGuiScreen(); - - private Dimension screenSize; - - private Background background = Background.DEFAULT; - - private boolean enabledRepeatedKeyEvents = true; - - private GuiLabel title; - - protected boolean suppressVanillaKeys; - - public net.minecraft.client.gui.screen.Screen toMinecraft() { - return wrapped; - } - - @Override - public void layout(ReadableDimension size, RenderInfo renderInfo) { - if (size == null) { - size = screenSize; - } - if (renderInfo.layer == 0) { - if (title != null) { - title.layout(title.getMinSize(), renderInfo); - } - } - super.layout(size, renderInfo); - if (renderInfo.layer == getMaxLayer()) { - final GuiElement tooltip = forEach(GuiElement.class, e -> e.getTooltip(renderInfo)); - if (tooltip != null) { - tooltip.layout(tooltip.getMinSize(), renderInfo); - } - } - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - if (renderInfo.layer == 0) { - switch (background) { - case NONE: - break; - case DEFAULT: - //#if MC>=11600 - wrapped.renderBackground(renderer.getMatrixStack()); - //#else - //$$ wrapped.renderBackground(); - //#endif - break; - case TRANSPARENT: - int top = 0xc0_10_10_10, bottom = 0xd0_10_10_10; - renderer.drawRect(0, 0, size.getWidth(), size.getHeight(), top, top, bottom, bottom); - break; - case DIRT: - //#if MC>=11600 - wrapped.renderBackgroundTexture(0); - //#else - //$$ wrapped.renderDirtBackground(0); - //#endif - break; - } - if (title != null) { - ReadableDimension titleSize = title.getMinSize(); - int x = screenSize.getWidth() / 2 - titleSize.getWidth() / 2; - OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, new Point(x, 10), new Dimension(0, 0)); - title.draw(eRenderer, titleSize, renderInfo); - } - } - super.draw(renderer, size, renderInfo); - if (renderInfo.layer == getMaxLayer()) { - final GuiElement tooltip = forEach(GuiElement.class, e -> e.getTooltip(renderInfo)); - if (tooltip != null) { - final ReadableDimension tooltipSize = tooltip.getMinSize(); - int x, y; - if (renderInfo.mouseX + 8 + tooltipSize.getWidth() < screenSize.getWidth()) { - x = renderInfo.mouseX + 8; - } else { - x = screenSize.getWidth() - tooltipSize.getWidth() - 1; - } - if (renderInfo.mouseY + 8 + tooltipSize.getHeight() < screenSize.getHeight()) { - y = renderInfo.mouseY + 8; - } else { - y = screenSize.getHeight() - tooltipSize.getHeight() - 1; - } - final ReadablePoint position = new Point(x, y); - try { - OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, position, tooltipSize); - tooltip.draw(eRenderer, tooltipSize, renderInfo); - } catch (Exception ex) { - CrashReport crashReport = CrashReport.create(ex, "Rendering Gui Tooltip"); - renderInfo.addTo(crashReport); - CrashReportSection category = crashReport.addElement("Gui container details"); - MCVer.addDetail(category, "Container", this::toString); - MCVer.addDetail(category, "Width", () -> "" + size.getWidth()); - MCVer.addDetail(category, "Height", () -> "" + size.getHeight()); - category = crashReport.addElement("Tooltip details"); - MCVer.addDetail(category, "Element", tooltip::toString); - MCVer.addDetail(category, "Position", position::toString); - MCVer.addDetail(category, "Size", tooltipSize::toString); - throw new CrashException(crashReport); - } - } - } - } - - @Override - public ReadableDimension getMinSize() { - return screenSize; - } - - @Override - public ReadableDimension getMaxSize() { - return screenSize; - } - - public void setEnabledRepeatedKeyEvents(boolean enableRepeatKeyEvents) { - this.enabledRepeatedKeyEvents = enableRepeatKeyEvents; - if (wrapped.active) { - Keyboard.enableRepeatEvents(enableRepeatKeyEvents); - } - } - - public void display() { - getMinecraft().openScreen(toMinecraft()); - } - - public Background getBackground() { - return this.background; - } - - public boolean isEnabledRepeatedKeyEvents() { - return this.enabledRepeatedKeyEvents; - } - - public GuiLabel getTitle() { - return this.title; - } - - public void setBackground(Background background) { - this.background = background; - } - - public void setTitle(GuiLabel title) { - this.title = title; - } - - protected class MinecraftGuiScreen extends net.minecraft.client.gui.screen.Screen { - private boolean active; - - //#if MC>=11400 - protected MinecraftGuiScreen() { - super(null); - } - - @Override - public String getNarrationMessage() { - return title == null ? "" : title.getString(); - } - //#endif - - @Override - //#if MC>=11600 - public void render(MatrixStack stack, int mouseX, int mouseY, float partialTicks) { - //#else - //#if MC>=11400 - //$$ public void render(int mouseX, int mouseY, float partialTicks) { - //#else - //$$ public void drawScreen(int mouseX, int mouseY, float partialTicks) { - //#endif - //$$ MatrixStack stack = new MatrixStack(); - //#endif - // The Forge loading screen apparently leaves one of the textures of the GlStateManager in an - // incorrect state which can cause the whole screen to just remain white. This is a workaround. - //#if MC>=10800 && MC<11400 - //$$ GlStateManager.disableTexture2D(); - //$$ GlStateManager.enableTexture2D(); - //#endif - - int layers = getMaxLayer(); - RenderInfo renderInfo = new RenderInfo(partialTicks, mouseX, mouseY, 0); - for (int layer = 0; layer <= layers; layer++) { - layout(screenSize, renderInfo.layer(layer)); - } - MinecraftGuiRenderer renderer = new MinecraftGuiRenderer(stack); - for (int layer = 0; layer <= layers; layer++) { - draw(renderer, screenSize, renderInfo.layer(layer)); - } - } - - //#if MC>=11400 - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - Point mouse = MouseUtils.getMousePos(); - boolean ctrlDown = hasControlDown(); - boolean shiftDown = hasShiftDown(); - if (!invokeHandlers(Typeable.class, e -> e.typeKey(mouse, keyCode, '\0', ctrlDown, shiftDown))) { - if (suppressVanillaKeys) { - return false; - } - return super.keyPressed(keyCode, scanCode, modifiers); - } - return true; - } - - @Override - public boolean charTyped(char keyChar, int scanCode) { - Point mouse = MouseUtils.getMousePos(); - boolean ctrlDown = hasControlDown(); - boolean shiftDown = hasShiftDown(); - if (!invokeHandlers(Typeable.class, e -> e.typeKey(mouse, 0, keyChar, ctrlDown, shiftDown))) { - if (suppressVanillaKeys) { - return false; - } - return super.charTyped(keyChar, scanCode); - } - return true; - } - //#else - //$$ @Override - //$$ protected void keyTyped(char typedChar, int keyCode) - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //$$ Point mouse = MouseUtils.getMousePos(); - //$$ boolean ctrlDown = isCtrlKeyDown(); - //$$ boolean shiftDown = isShiftKeyDown(); - //$$ if (!invokeHandlers(Typeable.class, e -> e.typeKey(mouse, keyCode, typedChar, ctrlDown, shiftDown))) { - //$$ if (suppressVanillaKeys) { - //$$ return; - //$$ } - //$$ super.keyTyped(typedChar, keyCode); - //$$ } - //$$ } - //#endif - - @Override - //#if MC>=11400 - public boolean mouseClicked(double mouseXD, double mouseYD, int mouseButton) { - int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); - return - //#else - //$$ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //#endif - invokeHandlers(Clickable.class, e -> e.mouseClick(new Point(mouseX, mouseY), mouseButton)); - } - - @Override - //#if MC>=11400 - public boolean mouseReleased(double mouseXD, double mouseYD, int mouseButton) { - int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); - return - //#else - //$$ protected void mouseReleased(int mouseX, int mouseY, int mouseButton) { - //#endif - invokeHandlers(Draggable.class, e -> e.mouseRelease(new Point(mouseX, mouseY), mouseButton)); - } - - @Override - //#if MC>=11400 - public boolean mouseDragged(double mouseXD, double mouseYD, int mouseButton, double deltaX, double deltaY) { - int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); - long timeSinceLastClick = 0; - return - //#else - //$$ protected void mouseClickMove(int mouseX, int mouseY, int mouseButton, long timeSinceLastClick) { - //#endif - invokeHandlers(Draggable.class, e -> e.mouseDrag(new Point(mouseX, mouseY), mouseButton, timeSinceLastClick)); - } - - @Override - //#if MC>=11400 - public void tick() { - //#else - //$$ public void updateScreen() { - //#endif - invokeAll(Tickable.class, Tickable::tick); - } - - //#if MC>=11400 - @Override - public boolean mouseScrolled( - //#if MC>=11400 - double mouseX, - double mouseY, - //#endif - double dWheel - ) { - //#if MC>=11400 - Point mouse = new Point((int) mouseX, (int) mouseY); - //#else - //$$ Point mouse = MouseUtils.getMousePos(); - //#endif - int wheel = (int) (dWheel * 120); - return invokeHandlers(Scrollable.class, e -> e.scroll(mouse, wheel)); - } - //#else - //$$ @Override - //$$ public void handleMouseInput() - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //$$ super.handleMouseInput(); - //$$ if (Mouse.hasWheel() && Mouse.getEventDWheel() != 0) { - //$$ Point mouse = MouseUtils.getMousePos(); - //$$ int wheel = Mouse.getEventDWheel(); - //$$ invokeHandlers(Scrollable.class, e -> e.scroll(mouse, wheel)); - //$$ } - //$$ } - //#endif - - @Override - //#if MC>=11400 - public void removed() { - //#else - //$$ public void onGuiClosed() { - //#endif - invokeAll(Closeable.class, Closeable::close); - active = false; - if (enabledRepeatedKeyEvents) { - Keyboard.enableRepeatEvents(false); - } - } - - @Override - //#if MC>=11400 - public void init() { - //#else - //$$ public void initGui() { - //#endif - active = false; - if (enabledRepeatedKeyEvents) { - Keyboard.enableRepeatEvents(true); - } - screenSize = new Dimension(width, height); - invokeAll(Loadable.class, Loadable::load); - } - - public T getWrapper() { - return AbstractGuiScreen.this.getThis(); - } - } - - public enum Background { - NONE, DEFAULT, TRANSPARENT, DIRT; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScrollable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScrollable.java deleted file mode 100644 index afcf5d53..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiScrollable.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.OffsetGuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.function.Scrollable; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; - -public abstract class AbstractGuiScrollable> extends AbstractGuiContainer - implements Scrollable { - private int offsetX, offsetY; - private final ReadablePoint negativeOffset = new ReadablePoint() { - @Override - public int getX() { - return -offsetX; - } - - @Override - public int getY() { - return -offsetY; - } - - @Override - public void getLocation(WritablePoint dest) { - dest.setLocation(getX(), getY()); - } - }; - - private Direction scrollDirection = Direction.VERTICAL; - - protected ReadableDimension lastRenderSize; - - public AbstractGuiScrollable() { - } - - public AbstractGuiScrollable(GuiContainer container) { - super(container); - } - - @Override - public void convertFor(GuiElement element, Point point, int relativeLayer) { - super.convertFor(element, point, relativeLayer); - if (relativeLayer > 0 || (point.getX() > 0 && point.getX() < lastRenderSize.getWidth() - && point.getY() > 0 && point.getY() < lastRenderSize.getHeight())) { - point.translate(offsetX, offsetY); - } else { - point.setLocation(Integer.MIN_VALUE, Integer.MIN_VALUE); - } - } - - @Override - public void layout(ReadableDimension size, RenderInfo renderInfo) { - if (size != null) { - int width = size.getWidth(); - int height = size.getHeight(); - lastRenderSize = size; - size = super.calcMinSize(); - size = new Dimension(Math.max(width, size.getWidth()), Math.max(height, size.getHeight())); - renderInfo = renderInfo.offsetMouse(-offsetX, -offsetY); - } - super.layout(size, renderInfo); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - int width = size.getWidth(); - int height = size.getHeight(); - size = super.calcMinSize(); - size = new Dimension(Math.max(width, size.getWidth()), Math.max(height, size.getHeight())); - renderInfo = renderInfo.offsetMouse(-offsetX, -offsetY); - - OffsetGuiRenderer offsetRenderer = new OffsetGuiRenderer(renderer, negativeOffset, size, renderInfo.layer == 0); - offsetRenderer.startUsing(); - super.draw(offsetRenderer, size, renderInfo); - offsetRenderer.stopUsing(); - } - - @Override - public ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - @Override - public boolean scroll(ReadablePoint mousePosition, int dWheel) { - Point mouse = new Point(mousePosition); - if (getContainer() != null) { - getContainer().convertFor(this, mouse); - } - if (mouse.getX() > 0 && mouse.getY() > 0 - && mouse.getX() < lastRenderSize.getWidth() && mouse.getY() < lastRenderSize.getHeight()) { - // Reduce scrolling speed but make sure it is never rounded to 0 - dWheel = (int) Math.copySign(Math.ceil(Math.abs(dWheel) / 4.0), dWheel); - if (scrollDirection == Direction.HORIZONTAL) { - scrollX(dWheel); - } else { - scrollY(dWheel); - } - return true; - } - return false; - } - - public int getOffsetX() { - return offsetX; - } - - public T setOffsetX(int offsetX) { - this.offsetX = offsetX; - return getThis(); - } - - public int getOffsetY() { - return offsetY; - } - - public T setOffsetY(int offsetY) { - this.offsetY = offsetY; - return getThis(); - } - - public Direction getScrollDirection() { - return scrollDirection; - } - - public T setScrollDirection(Direction scrollDirection) { - this.scrollDirection = scrollDirection; - return getThis(); - } - - public T scrollX(int dPixel) { - offsetX = Math.max(0, Math.min(super.calcMinSize().getWidth() - lastRenderSize.getWidth(), offsetX - dPixel)); - return getThis(); - } - - public T scrollY(int dPixel) { - offsetY = Math.max(0, Math.min(super.calcMinSize().getHeight() - lastRenderSize.getHeight(), offsetY - dPixel)); - return getThis(); - } - - public enum Direction { - VERTICAL, HORIZONTAL - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiVerticalList.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiVerticalList.java deleted file mode 100644 index 94627bc3..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/AbstractGuiVerticalList.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.function.Draggable; -import de.johni0702.minecraft.gui.layout.CustomLayout; -import de.johni0702.minecraft.gui.layout.VerticalLayout; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension; - -import static de.johni0702.minecraft.gui.utils.Colors.TRANSPARENT; -import static de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor.BLACK; - -public abstract class AbstractGuiVerticalList> extends AbstractGuiScrollable - implements Draggable { - public static final ReadableColor BACKGROUND = new Color(0, 0, 0, 150); - - private final VerticalLayout listLayout = new VerticalLayout().setSpacing(3); - - private final GuiPanel listPanel = new GuiPanel(this).setLayout(listLayout); - - { - setLayout(new CustomLayout() { - @Override - protected void layout(T container, int width, int height) { - pos(listPanel, width / 2 - width(listPanel) / 2, 5); - } - - @Override - public ReadableDimension calcMinSize(GuiContainer container) { - final ReadableDimension panelSize = listPanel.getMinSize(); - return new ReadableDimension() { - @Override - public int getWidth() { - return panelSize.getWidth(); - } - - @Override - public int getHeight() { - return panelSize.getHeight() + 10; - } - - @Override - public void getSize(WritableDimension dest) { - dest.setSize(getWidth(), getHeight()); - } - }; - } - }); - } - - private boolean drawShadow, drawSlider; - - private ReadablePoint lastMousePos; - private boolean draggingSlider; - - public AbstractGuiVerticalList() { - } - - public AbstractGuiVerticalList(GuiContainer container) { - super(container); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - int width = size.getWidth(); - int height = size.getHeight(); - if (drawShadow) { - renderer.drawRect(0, 0, width, height, BACKGROUND); - super.draw(renderer, size, renderInfo); - renderer.drawRect(0, 0, width, 4, BLACK, BLACK, TRANSPARENT, TRANSPARENT); - renderer.drawRect(0, height - 4, width, 4, TRANSPARENT, TRANSPARENT, BLACK, BLACK); - } else { - super.draw(renderer, size, renderInfo); - } - - if (drawSlider) { - ReadableDimension contentSize = listPanel.calcMinSize(); - int contentHeight = contentSize.getHeight() + 10; - if (contentHeight > height) { - int sliderX = width / 2 + contentSize.getWidth() / 2 + 3; - renderer.drawRect(sliderX, 0, 6, height, BLACK); // Draw slider background - int sliderY = getOffsetY() * height / contentHeight; - int sliderSize = height * height / contentHeight; - // Draw slider, with shadows - renderer.drawRect(sliderX, sliderY, 6, sliderSize, Color.LTGREY); // Slider - renderer.drawRect(sliderX + 5, sliderY, 1, sliderSize, Color.GREY); // Right shadow - renderer.drawRect(sliderX, sliderY + sliderSize - 1, 6, 1, Color.GREY); // Bottom shadow - } - } - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - position = convert(position); - if (isOnThis(position)) { - if (isOnSliderBar(position)) { - draggingSlider = true; - } - lastMousePos = position; - // We must not return true here - // because if we did, non of our children were able to process click events at all - } - return false; - } - - @Override - public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) { - position = convert(position); - if (lastMousePos != null) { - int dPixel = lastMousePos.getY() - position.getY(); - if (draggingSlider) { - int contentHeight = listPanel.calcMinSize().getHeight(); - int renderHeight = lastRenderSize.getHeight(); - scrollY(dPixel * (contentHeight + renderHeight) / renderHeight); - } else { - scrollY(-dPixel); - } - lastMousePos = position; - // Returning false on purpose, see #mouseClick - } - return false; - } - - @Override - public boolean mouseRelease(ReadablePoint position, int button) { - if (lastMousePos != null) { - lastMousePos = null; - draggingSlider = false; - // Returning false on purpose, see #mouseClick - } - return false; - } - - private ReadablePoint convert(ReadablePoint readablePoint) { - if (getContainer() != null) { - Point point = new Point(readablePoint); - getContainer().convertFor(this, point); - return point; - } - return readablePoint; - } - - private boolean isOnThis(ReadablePoint point) { - return point.getX() > 0 && point.getY() > 0 - && point.getX() < lastRenderSize.getWidth() && point.getY() < lastRenderSize.getHeight(); - } - - private boolean isOnSliderBar(ReadablePoint point) { - if (!drawSlider) { - return false; - } - int sliderX = lastRenderSize.getWidth() / 2 + listPanel.calcMinSize().getWidth() / 2 + 3; - return sliderX <= point.getX() && point.getX() < sliderX + 6; - } - - private boolean isOnBackground(ReadablePoint point) { - int width = lastRenderSize.getWidth(); - int listPanelWidth = listPanel.calcMinSize().getWidth(); - return point.getX() < width / 2 - listPanelWidth / 2 - || width / 2 + listPanelWidth / 2 + (drawSlider ? 6 : 0) < point.getX(); - } - - public boolean doesDrawSlider() { - return drawSlider; - } - - public T setDrawSlider(boolean drawSlider) { - this.drawSlider = drawSlider; - return getThis(); - } - - public boolean doesDrawShadow() { - return drawShadow; - } - - public T setDrawShadow(boolean drawShadow) { - this.drawShadow = drawShadow; - return getThis(); - } - - public VerticalLayout getListLayout() { - return this.listLayout; - } - - public GuiPanel getListPanel() { - return this.listPanel; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiClickable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiClickable.java deleted file mode 100644 index e2cc8b11..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiClickable.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -public class GuiClickable extends AbstractGuiClickableContainer { - - public GuiClickable() { - } - - public GuiClickable(GuiContainer container) { - super(container); - } - - @Override - protected GuiClickable getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiContainer.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiContainer.java deleted file mode 100644 index e1149c63..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiContainer.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -import de.johni0702.minecraft.gui.element.ComposedGuiElement; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.layout.Layout; -import de.johni0702.minecraft.gui.layout.LayoutData; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; - -import java.util.Comparator; -import java.util.Map; - -public interface GuiContainer> extends ComposedGuiElement { - - T setLayout(Layout layout); - Layout getLayout(); - - void convertFor(GuiElement element, Point point); - - /** - * Converts the global coordinates of the point to ones relative to the element. - * @param element The element, must be part of this container - * @param point The point - * @param relativeLayer Layer at which the point is relative to this element, - * positive values are above this element - */ - void convertFor(GuiElement element, Point point, int relativeLayer); - - Map getElements(); - T addElements(LayoutData layoutData, GuiElement... elements); - T removeElement(GuiElement element); - T sortElements(); - T sortElements(Comparator comparator); - - ReadableColor getBackgroundColor(); - T setBackgroundColor(ReadableColor backgroundColor); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiOverlay.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiOverlay.java deleted file mode 100644 index 25f777e1..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiOverlay.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -public class GuiOverlay extends AbstractGuiOverlay { - @SuppressWarnings("unchecked") - public static AbstractGuiOverlay from(net.minecraft.client.gui.screen.Screen minecraft) { - if (!(minecraft instanceof AbstractGuiOverlay.UserInputGuiScreen)) { - return null; - } - return ((AbstractGuiOverlay.UserInputGuiScreen) minecraft).getOverlay(); - } - - @Override - protected GuiOverlay getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiPanel.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiPanel.java deleted file mode 100644 index d142c9ed..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiPanel.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.layout.Layout; -import de.johni0702.minecraft.gui.layout.LayoutData; - -import java.util.ArrayList; -import java.util.Map; - -public class GuiPanel extends AbstractGuiContainer { - - public GuiPanel() { - } - - public GuiPanel(GuiContainer container) { - super(container); - } - - GuiPanel(Layout layout, int width , int height, Map withElements) { - setLayout(layout); - if (width != 0 || height != 0) { - setSize(width, height); - } - for (Map.Entry e : withElements.entrySet()) { - addElements(e.getValue(), e.getKey()); - } - } - - public static GuiPanelBuilder builder() { - return new GuiPanelBuilder(); - } - - @Override - protected GuiPanel getThis() { - return this; - } - - public static class GuiPanelBuilder { - private Layout layout; - private int width; - private int height; - private ArrayList withElements$key; - private ArrayList withElements$value; - - GuiPanelBuilder() { - } - - public GuiPanelBuilder layout(Layout layout) { - this.layout = layout; - return this; - } - - public GuiPanelBuilder width(int width) { - this.width = width; - return this; - } - - public GuiPanelBuilder height(int height) { - this.height = height; - return this; - } - - public GuiPanelBuilder with(GuiElement withKey, LayoutData withValue) { - if (this.withElements$key == null) { - this.withElements$key = new ArrayList(); - this.withElements$value = new ArrayList(); - } - this.withElements$key.add(withKey); - this.withElements$value.add(withValue); - return this; - } - - public GuiPanelBuilder withElements(Map withElements) { - if (this.withElements$key == null) { - this.withElements$key = new ArrayList(); - this.withElements$value = new ArrayList(); - } - for (final Map.Entry $lombokEntry : withElements.entrySet()) { - this.withElements$key.add($lombokEntry.getKey()); - this.withElements$value.add($lombokEntry.getValue()); - } - return this; - } - - public GuiPanelBuilder clearWithElements() { - if (this.withElements$key != null) { - this.withElements$key.clear(); - this.withElements$value.clear(); - } - return this; - } - - public GuiPanel build() { - Map withElements; - switch (this.withElements$key == null ? 0 : this.withElements$key.size()) { - case 0: - withElements = java.util.Collections.emptyMap(); - break; - case 1: - withElements = java.util.Collections.singletonMap(this.withElements$key.get(0), this.withElements$value.get(0)); - break; - default: - withElements = new java.util.LinkedHashMap(this.withElements$key.size() < 1073741824 ? 1 + this.withElements$key.size() + (this.withElements$key.size() - 3) / 3 : Integer.MAX_VALUE); - for (int $i = 0; $i < this.withElements$key.size(); $i++) - withElements.put(this.withElements$key.get($i), (LayoutData) this.withElements$value.get($i)); - withElements = java.util.Collections.unmodifiableMap(withElements); - } - - return new GuiPanel(layout, width, height, withElements); - } - - public String toString() { - return "GuiPanel.GuiPanelBuilder(layout=" + this.layout + ", width=" + this.width + ", height=" + this.height + ", withElements$key=" + this.withElements$key + ", withElements$value=" + this.withElements$value + ")"; - } - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiScreen.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiScreen.java deleted file mode 100644 index b90cbf7c..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiScreen.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -public class GuiScreen extends AbstractGuiScreen { - @SuppressWarnings("unchecked") - public static AbstractGuiScreen from(net.minecraft.client.gui.screen.Screen minecraft) { - if (!(minecraft instanceof AbstractGuiScreen.MinecraftGuiScreen)) { - return null; - } - return ((AbstractGuiScreen.MinecraftGuiScreen) minecraft).getWrapper(); - } - - public static GuiScreen wrap(final net.minecraft.client.gui.screen.Screen minecraft) { - return new GuiScreen() { - @Override - public net.minecraft.client.gui.screen.Screen toMinecraft() { - return minecraft; - } - }; - } - - @Override - protected GuiScreen getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiScrollable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiScrollable.java deleted file mode 100644 index fbf75c9b..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiScrollable.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -public class GuiScrollable extends AbstractGuiScrollable { - public GuiScrollable() { - } - - public GuiScrollable(GuiContainer container) { - super(container); - } - - @Override - protected GuiScrollable getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiVerticalList.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiVerticalList.java deleted file mode 100644 index ce1d2c3c..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/GuiVerticalList.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.container; - -public class GuiVerticalList extends AbstractGuiVerticalList { - public GuiVerticalList() { - } - - public GuiVerticalList(GuiContainer container) { - super(container); - } - - @Override - protected GuiVerticalList getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/container/VanillaGuiScreen.java b/jGui/src/main/java/de/johni0702/minecraft/gui/container/VanillaGuiScreen.java deleted file mode 100644 index 661528c1..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/container/VanillaGuiScreen.java +++ /dev/null @@ -1,282 +0,0 @@ -package de.johni0702.minecraft.gui.container; - -import de.johni0702.minecraft.gui.function.Draggable; -import de.johni0702.minecraft.gui.function.Scrollable; -import de.johni0702.minecraft.gui.function.Typeable; -import de.johni0702.minecraft.gui.utils.EventRegistrations; -import de.johni0702.minecraft.gui.utils.MouseUtils; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; -import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback; -import de.johni0702.minecraft.gui.versions.callbacks.OpenGuiScreenCallback; -import de.johni0702.minecraft.gui.versions.callbacks.PostRenderScreenCallback; -import de.johni0702.minecraft.gui.versions.callbacks.PreTickCallback; -import net.minecraft.client.util.math.MatrixStack; - -//#if FABRIC>=1 -import de.johni0702.minecraft.gui.versions.callbacks.KeyboardCallback; -import de.johni0702.minecraft.gui.versions.callbacks.MouseCallback; -//#elseif MC<=11202 -//$$ import net.minecraftforge.client.event.GuiOpenEvent; -//$$ import net.minecraftforge.client.event.GuiScreenEvent; -//$$ import net.minecraftforge.fml.common.eventhandler.EventPriority; -//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -//#endif - -//#if MC<10800 -//$$ import cpw.mods.fml.common.eventhandler.Cancelable; -//$$ import cpw.mods.fml.common.eventhandler.Event; -//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; -//#endif - -//#if MC<11400 -//$$ import net.minecraftforge.common.MinecraftForge; -//$$ import java.io.IOException; -//#endif - -import java.util.Collections; -import java.util.Map; -import java.util.WeakHashMap; - - -public class VanillaGuiScreen extends GuiScreen implements Draggable, Typeable, Scrollable { - - private static final Map WRAPPERS = - Collections.synchronizedMap(new WeakHashMap<>()); - - public static VanillaGuiScreen wrap(net.minecraft.client.gui.screen.Screen originalGuiScreen) { - VanillaGuiScreen gui = WRAPPERS.get(originalGuiScreen); - if (gui == null) { - WRAPPERS.put(originalGuiScreen, gui = new VanillaGuiScreen(originalGuiScreen)); - gui.register(); - } - return gui; - } - - // Use wrap instead and make sure to preserve the existing layout. - // (or if you really want your own, inline this code) - @Deprecated - public static VanillaGuiScreen setup(net.minecraft.client.gui.screen.Screen originalGuiScreen) { - VanillaGuiScreen gui = new VanillaGuiScreen(originalGuiScreen); - gui.register(); - return gui; - } - - private final net.minecraft.client.gui.screen.Screen mcScreen; - private final EventHandler eventHandler = new EventHandler(); - - public VanillaGuiScreen(net.minecraft.client.gui.screen.Screen mcScreen) { - this.mcScreen = mcScreen; - this.suppressVanillaKeys = true; - - super.setBackground(Background.NONE); - } - - // Needs to be called from or after GuiInitEvent.Post, will auto-unregister on any GuiOpenEvent - public void register() { - if (!eventHandler.active) { - eventHandler.active = true; - - eventHandler.register(); - - getSuperMcGui().init(MCVer.getMinecraft(), mcScreen.width, mcScreen.height); - } - } - - public void display() { - getMinecraft().openScreen(mcScreen); - register(); - } - - @Override - public net.minecraft.client.gui.screen.Screen toMinecraft() { - return mcScreen; - } - - @Override - public void setBackground(Background background) { - throw new UnsupportedOperationException("Cannot set background of vanilla gui screen."); - } - - private net.minecraft.client.gui.screen.Screen getSuperMcGui() { - return super.toMinecraft(); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif - return false; - } - - @Override - public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif - return false; - } - - @Override - public boolean mouseRelease(ReadablePoint position, int button) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif - return false; - } - - @Override - public boolean scroll(ReadablePoint mousePosition, int dWheel) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif - return false; - } - - @Override - public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif - return false; - } - - // Used when wrapping an already existing mc.GuiScreen - //#if MC>=10800 - private - //#else - //$$ public - //#endif - class EventHandler extends EventRegistrations - //#if FABRIC>=1 - implements KeyboardCallback, MouseCallback - //#endif - { - private boolean active; - - { on(OpenGuiScreenCallback.EVENT, screen -> onGuiClosed()); } - private void onGuiClosed() { - unregister(); - - if (active) { - active = false; - getSuperMcGui().removed(); - WRAPPERS.remove(mcScreen, VanillaGuiScreen.this); - } - } - - { on(InitScreenCallback.Pre.EVENT, this::preGuiInit); } - private void preGuiInit(net.minecraft.client.gui.screen.Screen screen) { - if (screen == mcScreen && active) { - active = false; - unregister(); - getSuperMcGui().removed(); - WRAPPERS.remove(mcScreen, VanillaGuiScreen.this); - } - } - - { on(PostRenderScreenCallback.EVENT, this::onGuiRender); } - private void onGuiRender(MatrixStack stack, float partialTicks) { - Point mousePos = MouseUtils.getMousePos(); - getSuperMcGui().render( - //#if MC>=11600 - stack, - //#endif - mousePos.getX(), mousePos.getY(), partialTicks); - } - - { on(PreTickCallback.EVENT, this::tickOverlay); } - private void tickOverlay() { - //#if MC>=11400 - getSuperMcGui().tick(); - //#else - //$$ getSuperMcGui().updateScreen(); - //#endif - } - - //#if FABRIC>=1 - { on(MouseCallback.EVENT, this); } - - @Override - public boolean mouseDown(double x, double y, int button) { - return getSuperMcGui().mouseClicked(x, y, button); - } - - @Override - public boolean mouseDrag(double x, double y, int button, double dx, double dy) { - return getSuperMcGui().mouseDragged(x, y, button, dx, dy); - } - - @Override - public boolean mouseUp(double x, double y, int button) { - return getSuperMcGui().mouseReleased(x, y, button); - } - - @Override - public boolean mouseScroll(double x, double y, double scroll) { - return getSuperMcGui().mouseScrolled(x, y, scroll); - } - - { on(KeyboardCallback.EVENT, this); } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - return getSuperMcGui().keyPressed(keyCode, scanCode, modifiers); - } - - @Override - public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - return getSuperMcGui().keyReleased(keyCode, scanCode, modifiers); - } - - @Override - public boolean charTyped(char keyChar, int scanCode) { - return getSuperMcGui().charTyped(keyChar, scanCode); - } - //#elseif MC<=11202 - //$$ private boolean handled; - //$$ - //$$ // Mouse/Keyboard events aren't supported in 1.7.10 - //$$ // so this requires a mixin in any mod making use of it - //$$ // (see ReplayMod: GuiScreenMixin) - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //#if MC>=10800 - //$$ public void onMouseInput(GuiScreenEvent.MouseInputEvent.Pre event) throws IOException { - //#else - //$$ public void onMouseInput(MouseInputEvent event) throws IOException { - //#endif - //$$ handled = true; - //$$ getSuperMcGui().handleMouseInput(); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } - //$$ } - //$$ - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //#if MC>=10800 - //$$ public void onKeyboardInput(GuiScreenEvent.KeyboardInputEvent.Pre event) throws IOException { - //#else - //$$ public void onKeyboardInput(KeyboardInputEvent event) throws IOException { - //#endif - //$$ handled = true; - //$$ getSuperMcGui().handleKeyboardInput(); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } - //$$ } - //#endif - } - //#if MC<=10710 - //$$ @Cancelable - //$$ public static class MouseInputEvent extends Event {} - //$$ @Cancelable - //$$ public static class KeyboardInputEvent extends Event {} - //#endif -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractComposedGuiElement.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractComposedGuiElement.java deleted file mode 100644 index f5faab33..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractComposedGuiElement.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -import java.util.function.BiFunction; -import java.util.function.Function; - -public abstract class AbstractComposedGuiElement> - extends AbstractGuiElement implements ComposedGuiElement { - public AbstractComposedGuiElement() { - } - - public AbstractComposedGuiElement(GuiContainer container) { - super(container); - } - - @Override - public int getMaxLayer() { - return getLayer() + getChildren() - .stream() - .mapToInt(e -> e instanceof ComposedGuiElement ? ((ComposedGuiElement) e).getMaxLayer() : e.getLayer()) - .max() - .orElse(0); - } - - @Override - public R forEach( - int layer, - Class ofType, - BiFunction, Integer, R> recurse, - Function function - ) { - if (ofType.isInstance(this) && getLayer() == layer) { - R result = function.apply(ofType.cast(this)); - if (result != null) { - return result; - } - } - for (final GuiElement element : getChildren()) { - R result = null; - if (element instanceof ComposedGuiElement) { - ComposedGuiElement composed = (ComposedGuiElement) element; - if (layer <= composed.getMaxLayer()) { - result = recurse.apply(composed, layer - composed.getLayer()); - } - } else if (ofType.isInstance(element) && element.getLayer() == layer) { - result = function.apply(ofType.cast(element)); - } - if (result != null) { - return result; - } - } - return null; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiButton.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiButton.java deleted file mode 100644 index 4ac3b3ed..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiButton.java +++ /dev/null @@ -1,243 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.util.Identifier; - -//#if MC>=11400 -import net.minecraft.client.sound.PositionedSoundInstance; -//#else -//$$ import net.minecraft.client.audio.PositionedSoundRecord; -//#endif - -//#if MC>=10904 -import net.minecraft.sound.SoundEvents; -import net.minecraft.sound.SoundEvent; -//#endif - -//#if MC>=10800 -import static com.mojang.blaze3d.platform.GlStateManager.*; -//#endif -import static de.johni0702.minecraft.gui.versions.MCVer.*; - -import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA; -import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA; - -public abstract class AbstractGuiButton> extends AbstractGuiClickable implements Clickable, IGuiButton { - protected static final Identifier BUTTON_SOUND = new Identifier("gui.button.press"); - protected static final Identifier WIDGETS_TEXTURE = new Identifier("textures/gui/widgets.png"); - - //#if MC>=10904 - private SoundEvent sound = SoundEvents.UI_BUTTON_CLICK; - //#endif - - private int labelColor = 0xe0e0e0; - private String label; - - private Identifier texture; - private ReadableDimension textureSize; - private ReadablePoint spriteUV; - private ReadableDimension spriteSize; - - public AbstractGuiButton() { - } - - public AbstractGuiButton(GuiContainer container) { - super(container); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - - color4f(1, 1, 1, 1); - - byte texture = 1; - int color = labelColor; - if (!isEnabled()) { - texture = 0; - color = 0xa0a0a0; - } else if (isMouseHovering(new Point(renderInfo.mouseX, renderInfo.mouseY))) { - texture = 2; - color = 0xffffa0; - } - - enableBlend(); - blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0); - blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - int textureY = 46 + texture * 20; - int halfWidth = size.getWidth() / 2; - int secondHalfWidth = size.getWidth() - halfWidth; - int halfHeight = size.getHeight() / 2; - int secondHalfHeight = size.getHeight() - halfHeight; - - renderer.bindTexture(WIDGETS_TEXTURE); - renderer.drawTexturedRect(0, 0, 0, textureY, halfWidth, halfHeight); - renderer.drawTexturedRect(0, halfHeight, 0, textureY + 20 - secondHalfHeight, halfWidth, secondHalfHeight); - renderer.drawTexturedRect(halfWidth, 0, 200 - secondHalfWidth, textureY, secondHalfWidth, halfHeight); - renderer.drawTexturedRect(halfWidth, halfHeight, 200 - secondHalfWidth, textureY + 20 - secondHalfHeight, secondHalfWidth, secondHalfHeight); - - if (this.texture != null) { - renderer.bindTexture(this.texture); - if (spriteUV != null && textureSize != null) { - ReadableDimension spriteSize = this.spriteSize != null ? this.spriteSize : getMinSize(); - renderer.drawTexturedRect(0, 0, spriteUV.getX(), spriteUV.getY(), size.getWidth(), size.getHeight(), - spriteSize.getWidth(), spriteSize.getHeight(), - textureSize.getWidth(), textureSize.getHeight()); - } else { - renderer.drawTexturedRect(0, 0, 0, 0, size.getWidth(), size.getHeight()); - } - } - - if (label != null) { - renderer.drawCenteredString(halfWidth, (size.getHeight() - 8) / 2, color, label, true); - } - } - - @Override - public ReadableDimension calcMinSize() { - if (label != null) { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - return new Dimension(fontRenderer.getWidth(label), 20); - } else { - return new Dimension(0, 0); - } - } - - @Override - public void onClick() { - playClickSound(getMinecraft()); - super.onClick(); - } - - public static void playClickSound(MinecraftClient mc) { - //#if MC>=10904 - playClickSound(mc, SoundEvents.UI_BUTTON_CLICK); - } - public static void playClickSound(MinecraftClient mc, SoundEvent sound) { - //#endif - //#if MC>=11400 - mc.getSoundManager().play(PositionedSoundInstance.master(sound, 1.0F)); - //#else - //#if MC>=10904 - //$$ mc.getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(sound, 1.0F)); - //#else - //#if MC>=10800 - //$$ mc.getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); - //#else - //$$ mc.getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F)); - //#endif - //#endif - //#endif - } - - @Override - public T setLabel(String label) { - this.label = label; - return getThis(); - } - - //#if MC>=10904 - @Override - public T setSound(SoundEvent sound) { - this.sound = sound; - return getThis(); - } - - public SoundEvent getSound() { - return this.sound; - } - //#endif - - @Override - public T setI18nLabel(String label, Object... args) { - return setLabel(I18n.translate(label, args)); - } - - public String getLabel() { - return this.label; - } - - public void setLabelColor(int labelColor) { - this.labelColor = labelColor; - } - - @Override - public Identifier getTexture() { - return texture; - } - - @Override - public T setTexture(Identifier texture) { - this.texture = texture; - return getThis(); - } - - @Override - public ReadableDimension getTextureSize() { - return textureSize; - } - - @Override - public T setTextureSize(ReadableDimension textureSize) { - this.textureSize = textureSize; - return getThis(); - } - - @Override - public ReadablePoint getSpriteUV() { - return spriteUV; - } - - @Override - public T setSpriteUV(ReadablePoint spriteUV) { - this.spriteUV = spriteUV; - return getThis(); - } - - @Override - public ReadableDimension getSpriteSize() { - return spriteSize; - } - - @Override - public T setSpriteSize(ReadableDimension spriteSize) { - this.spriteSize = spriteSize; - return getThis(); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiCheckbox.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiCheckbox.java deleted file mode 100644 index 2793bedb..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiCheckbox.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.util.Identifier; - -public abstract class AbstractGuiCheckbox> - extends AbstractGuiClickable implements IGuiCheckbox { - protected static final Identifier BUTTON_SOUND = new Identifier("gui.button.press"); - protected static final ReadableColor BOX_BACKGROUND_COLOR = new Color(46, 46, 46); - - private String label; - - private boolean checked; - - public AbstractGuiCheckbox() { - } - - public AbstractGuiCheckbox(GuiContainer container) { - super(container); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - - int color = 0xe0e0e0; - if (!isEnabled()) { - color = 0xa0a0a0; - } - - int boxSize = size.getHeight(); - renderer.drawRect(0, 0, boxSize, boxSize, ReadableColor.BLACK); - renderer.drawRect(1, 1, boxSize - 2, boxSize - 2, BOX_BACKGROUND_COLOR); - - if(isChecked()) { - renderer.drawCenteredString(boxSize / 2 + 1, 1, color, "x", true); - } - - renderer.drawString(boxSize + 2, 2, color, label); - } - - @Override - public ReadableDimension calcMinSize() { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int height = fontRenderer.fontHeight + 2; - int width = height + 2 + fontRenderer.getWidth(label); - return new Dimension(width, height); - } - - @Override - public ReadableDimension getMaxSize() { - return getMinSize(); - } - - @Override - public void onClick() { - AbstractGuiButton.playClickSound(getMinecraft()); - setChecked(!isChecked()); - super.onClick(); - } - - @Override - public T setLabel(String label) { - this.label = label; - return getThis(); - } - - @Override - public T setI18nLabel(String label, Object... args) { - return setLabel(I18n.translate(label, args)); - } - - @Override - public T setChecked(boolean checked) { - this.checked = checked; - return getThis(); - } - - public String getLabel() { - return this.label; - } - - public boolean isChecked() { - return this.checked; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiClickable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiClickable.java deleted file mode 100644 index 89ff4eba..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiClickable.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -public abstract class AbstractGuiClickable> extends AbstractGuiElement implements Clickable, IGuiClickable { - private Runnable onClick; - - public AbstractGuiClickable() { - } - - public AbstractGuiClickable(GuiContainer container) { - super(container); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - - if (isMouseHovering(pos) && isEnabled()) { - onClick(); - return true; - } - return false; - } - - protected boolean isMouseHovering(ReadablePoint pos) { - return pos.getX() > 0 && pos.getY() > 0 - && pos.getX() < getLastSize().getWidth() && pos.getY() < getLastSize().getHeight(); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - } - - protected void onClick() { - if (onClick != null) { - onClick.run(); - } - } - - @Override - public T onClick(Runnable onClick) { - this.onClick = onClick; - return getThis(); - } - - @Override - public Runnable getOnClick() { - return onClick; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiElement.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiElement.java deleted file mode 100644 index 615ae83d..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiElement.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.MinecraftClient; -import net.minecraft.util.Identifier; - -public abstract class AbstractGuiElement> implements GuiElement { - protected static final Identifier TEXTURE = new Identifier("jgui", "gui.png"); - - - private final MinecraftClient minecraft = MCVer.getMinecraft(); - - private GuiContainer container; - - private GuiElement tooltip; - - private boolean enabled = true; - - protected Dimension minSize, maxSize; - - /** - * The last size this element was render at layer 0. - * May be {@code null} when this element has not yet been rendered. - */ - private ReadableDimension lastSize; - - public AbstractGuiElement() { - } - - public AbstractGuiElement(GuiContainer container) { - container.addElements(null, this); - } - - protected abstract T getThis(); - - @Override - public void layout(ReadableDimension size, RenderInfo renderInfo) { - if (size == null) { - if (getContainer() == null) { - throw new RuntimeException("Any top containers must implement layout(null, ...) themselves!"); - } - getContainer().layout(size, renderInfo.layer(renderInfo.layer + getLayer())); - return; - } - if (renderInfo.layer == 0) { - lastSize = size; - } - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - } - - @Override - public T setEnabled(boolean enabled) { - this.enabled = enabled; - return getThis(); - } - - @Override - public T setEnabled() { - return setEnabled(true); - } - - @Override - public T setDisabled() { - return setEnabled(false); - } - - @Override - public GuiElement getTooltip(RenderInfo renderInfo) { - if (tooltip != null && lastSize != null) { - Point mouse = new Point(renderInfo.mouseX, renderInfo.mouseY); - if (container != null) { - container.convertFor(this, mouse); - } - if (mouse.getX() > 0 - && mouse.getY() > 0 - && mouse.getX() < lastSize.getWidth() - && mouse.getY() < lastSize.getHeight()) { - return tooltip; - } - } - return null; - } - - @Override - public T setTooltip(GuiElement tooltip) { - this.tooltip = tooltip; - return getThis(); - } - - @Override - public T setContainer(GuiContainer container) { - this.container = container; - return getThis(); - } - - public T setMinSize(ReadableDimension minSize) { - this.minSize = new Dimension(minSize); - return getThis(); - } - - public T setMaxSize(ReadableDimension maxSize) { - this.maxSize = new Dimension(maxSize); - return getThis(); - } - - public T setSize(ReadableDimension size) { - setMinSize(size); - return setMaxSize(size); - } - - public T setSize(int width, int height) { - return setSize(new Dimension(width, height)); - } - - public T setWidth(int width) { - if (minSize == null) { - minSize = new Dimension(width, 0); - } else { - minSize.setWidth(width); - } - if (maxSize == null) { - maxSize = new Dimension(width, Integer.MAX_VALUE); - } else { - maxSize.setWidth(width); - } - return getThis(); - } - - public T setHeight(int height) { - if (minSize == null) { - minSize = new Dimension(0, height); - } else { - minSize.setHeight(height); - } - if (maxSize == null) { - maxSize = new Dimension(Integer.MAX_VALUE, height); - } else { - maxSize.setHeight(height); - } - return getThis(); - } - - public int getLayer() { - return 0; - } - - @Override - public ReadableDimension getMinSize() { - ReadableDimension calcSize = calcMinSize(); - if (minSize == null) { - return calcSize; - } else { - if (minSize.getWidth() >= calcSize.getWidth() && minSize.getHeight() >= calcSize.getHeight()) { - return minSize; - } else { - return new Dimension( - Math.max(calcSize.getWidth(), minSize.getWidth()), - Math.max(calcSize.getHeight(), minSize.getHeight()) - ); - } - } - } - - protected abstract ReadableDimension calcMinSize(); - - @Override - public ReadableDimension getMaxSize() { - return maxSize == null ? new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE) : maxSize; - } - - public MinecraftClient getMinecraft() { - return this.minecraft; - } - - public GuiContainer getContainer() { - return this.container; - } - - public boolean isEnabled() { - return this.enabled; - } - - protected ReadableDimension getLastSize() { - return this.lastSize; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiHorizontalScrollbar.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiHorizontalScrollbar.java deleted file mode 100644 index 8ba0249c..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiHorizontalScrollbar.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.OffsetGuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.function.Draggable; -import de.johni0702.minecraft.gui.utils.Utils; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -public abstract class AbstractGuiHorizontalScrollbar> extends AbstractGuiElement implements Clickable, Draggable, IGuiHorizontalScrollbar { - protected static final int TEXTURE_FG_X = 0; - protected static final int TEXTURE_FG_Y = 0; - protected static final int TEXTURE_FG_WIDTH = 62; - protected static final int TEXTURE_FG_HEIGHT = 7; - protected static final int TEXTURE_BG_X = 0; - protected static final int TEXTURE_BG_Y = 7; - protected static final int TEXTURE_BG_WIDTH = 64; - protected static final int TEXTURE_BG_HEIGHT = 9; - - protected static final int BORDER_TOP = 1; - protected static final int BORDER_BOTTOM = 1; - protected static final int BORDER_LEFT = 1; - protected static final int BORDER_RIGHT = 1; - - private Runnable onValueChanged; - - private double zoom = 1; - private double offset; - - private ReadablePoint startDragging; - private boolean dragging; - - public AbstractGuiHorizontalScrollbar() { - } - - public AbstractGuiHorizontalScrollbar(GuiContainer container) { - super(container); - } - - @Override - protected ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - - if (isMouseHoveringBar(pos) && isEnabled()) { - dragging = true; - updateValue(pos); - return true; - } - return false; - } - - @Override - public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) { - if (dragging) { - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - updateValue(pos); - } - return dragging; - } - - @Override - public boolean mouseRelease(ReadablePoint position, int button) { - if (dragging) { - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - updateValue(pos); - dragging = false; - startDragging = null; - return true; - } else { - return false; - } - } - - protected boolean isMouseHoveringBar(ReadablePoint pos) { - int bodyWidth = getLastSize().getWidth() - BORDER_LEFT - BORDER_RIGHT; - int barOffset = (int) (bodyWidth * offset) + BORDER_LEFT; - int barWidth = (int) (bodyWidth * zoom); - return pos.getX() >= barOffset && pos.getY() > BORDER_TOP - && pos.getX() <= barOffset + barWidth && pos.getY() < getLastSize().getHeight() - BORDER_BOTTOM; - } - - protected void updateValue(ReadablePoint position) { - if (getLastSize() == null) { - return; - } - if (startDragging != null) { - double d = position.getX() - startDragging.getX(); - offset += d / (getLastSize().getWidth() - BORDER_LEFT - BORDER_RIGHT); - checkOffset(); - onValueChanged(); - } - startDragging = position; - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - int width = size.getWidth(); - int height = size.getHeight(); - - renderer.bindTexture(TEXTURE); - - // Draw background - // We have to increase the border size as there is one pixel row which is part of the border while drawing - // but isn't during position calculations due to shadows - Utils.drawDynamicRect(renderer, width, height, TEXTURE_BG_X, TEXTURE_BG_Y, TEXTURE_BG_WIDTH, TEXTURE_BG_HEIGHT, - BORDER_TOP + 1, BORDER_BOTTOM, BORDER_LEFT + 1, BORDER_RIGHT); - - // Draw slider - int bodyWidth = size.getWidth() - BORDER_LEFT - BORDER_RIGHT; - int barOffset = (int) (bodyWidth * offset) + BORDER_LEFT; - int barWidth = (int) (bodyWidth * zoom); - Utils.drawDynamicRect(new OffsetGuiRenderer(renderer, new Point(barOffset, BORDER_TOP), size), - barWidth, height - (BORDER_TOP + 1) - BORDER_BOTTOM, - TEXTURE_FG_X, TEXTURE_FG_Y, TEXTURE_FG_WIDTH, TEXTURE_FG_HEIGHT, 2, 1, 1, 1); - } - - public void onValueChanged() { - if (onValueChanged != null) { - onValueChanged.run(); - } - } - - @Override - public T onValueChanged(Runnable runnable) { - this.onValueChanged = runnable; - return getThis(); - } - - @Override - public T setPosition(double pos) { - this.offset = pos; - checkOffset(); - onValueChanged(); - return getThis(); - } - - @Override - public double getPosition() { - return offset; - } - - @Override - public T setZoom(double zoom) { - this.zoom = Math.min(1, Math.max(0.0001, zoom)); - checkOffset(); - onValueChanged(); - return getThis(); - } - - @Override - public double getZoom() { - return zoom; - } - - /** - * Make sure the offset is far enough to the left so we don't look over the edge on the right. - */ - private void checkOffset() { - if (offset < 0) { - offset = 0; - } else if (zoom + offset > 1) { - offset = 1 - zoom; - } - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiImage.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiImage.java deleted file mode 100644 index f22241ce..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiImage.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import com.google.common.base.Preconditions; -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.versions.Image; -import net.minecraft.client.texture.NativeImageBackedTexture; -import net.minecraft.util.Identifier; - -public abstract class AbstractGuiImage> - extends AbstractGuiElement implements IGuiImage { - private NativeImageBackedTexture texture; - private Identifier resourceLocation; - private int u, v; - private int uWidth, vHeight; - private int textureWidth, textureHeight; - - /** - * Reference to the copied image to prevent it from being garbage collected - * and subsequently releasing the OpenGL texture. - */ - private AbstractGuiImage copyOf; - - public AbstractGuiImage() { - } - - public AbstractGuiImage(GuiContainer container) { - super(container); - } - - public AbstractGuiImage(AbstractGuiImage copyOf) { - this.texture = copyOf.texture; - this.resourceLocation = copyOf.resourceLocation; - this.u = copyOf.u; - this.v = copyOf.v; - this.uWidth = copyOf.uWidth; - this.vHeight = copyOf.vHeight; - this.textureWidth = copyOf.textureWidth; - this.textureHeight = copyOf.textureHeight; - this.copyOf = copyOf; - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - if (texture != null) { - renderer.bindTexture(texture.getGlId()); - } else { - renderer.bindTexture(resourceLocation); - } - int w = size.getWidth(); - int h = size.getHeight(); - renderer.drawTexturedRect(0, 0, u, v, w, h, uWidth, vHeight, textureWidth, textureHeight); - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - if (texture != null && copyOf == null) { - //#if MC>=11400 - getMinecraft().execute(new Finalizer(texture)); - //#else - //$$ getMinecraft().addScheduledTask(new Finalizer(texture)); - //#endif - } - } - - @Override - public ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - @Override - public T setTexture(Image img) { - Preconditions.checkState(copyOf == null, "Cannot change texture of copy."); - resourceLocation = null; - if (texture != null) { - texture.clearGlId(); - } - texture = img.toTexture(); - textureWidth = uWidth = img.getWidth(); - textureHeight = vHeight = img.getHeight(); - return getThis(); - } - - @Override - public T setTexture(Identifier resourceLocation) { - Preconditions.checkState(copyOf == null, "Cannot change texture of copy."); - if (texture != null) { - texture.clearGlId(); - texture = null; - } - this.resourceLocation = resourceLocation; - textureWidth = textureHeight = 256; - return getThis(); - } - - @Override - public T setTexture(Identifier resourceLocation, int u, int v, int width, int height) { - setTexture(resourceLocation); - setUV(u, v); - setUVSize(width, height); - return getThis(); - } - - @Override - public T setU(int u) { - this.u = u; - return getThis(); - } - - @Override - public T setV(int v) { - this.v = v; - return getThis(); - } - - @Override - public T setUV(int u, int v) { - setU(u); - return setV(v); - } - - @Override - public T setUWidth(int width) { - this.uWidth = width; - return getThis(); - } - - @Override - public T setVHeight(int height) { - this.vHeight = height; - return getThis(); - } - - @Override - public T setUVSize(int width, int height) { - setUWidth(width); - return setVHeight(height); - } - - /** - * We use a static class here in order to prevent the inner class from keeping the outer class - * alive after finalization when still unloading the texture. - */ - private static final class Finalizer implements Runnable { - private final NativeImageBackedTexture texture; - - public Finalizer(NativeImageBackedTexture texture) { - this.texture = texture; - } - - @Override - public void run() { - texture.clearGlId(); - } - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiLabel.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiLabel.java deleted file mode 100644 index b95cc944..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiLabel.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; - -import java.util.List; - -//#if MC>=11600 -import java.util.Optional; -import java.util.stream.Collectors; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Style; -//#endif - -public abstract class AbstractGuiLabel> extends AbstractGuiElement implements IGuiLabel { - private String text = ""; - - private ReadableColor color = ReadableColor.WHITE, disabledColor = ReadableColor.GREY; - - public AbstractGuiLabel() { - } - - public AbstractGuiLabel(GuiContainer container) { - super(container); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - TextRenderer fontRenderer = MCVer.getFontRenderer(); - //#if MC>=11600 - List lines = fontRenderer.getTextHandler().wrapLines(new LiteralText(text), size.getWidth(), Style.EMPTY).stream() - .map(it -> it.visit(Optional::of)).filter(Optional::isPresent).map(Optional::get) - .collect(Collectors.toList()); - //#else - //$$ @SuppressWarnings("unchecked") - //$$ List lines = fontRenderer.wrapStringToWidthAsList(text, size.getWidth()); - //#endif - int y = 0; - for (String line : lines) { - renderer.drawString(0, y, isEnabled() ? color : disabledColor, line); - y+=fontRenderer.fontHeight; - } - } - - @Override - public ReadableDimension calcMinSize() { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - return new Dimension(fontRenderer.getWidth(text), fontRenderer.fontHeight); - } - - @Override - public ReadableDimension getMaxSize() { - return getMinSize(); - } - - @Override - public T setText(String text) { - this.text = text; - return getThis(); - } - - @Override - public T setI18nText(String text, Object... args) { - return setText(I18n.translate(text, args)); - } - - @Override - public T setColor(ReadableColor color) { - this.color = color; - return getThis(); - } - - @Override - public T setDisabledColor(ReadableColor disabledColor) { - this.disabledColor = disabledColor; - return getThis(); - } - - public String getText() { - return this.text; - } - - public ReadableColor getColor() { - return this.color; - } - - public ReadableColor getDisabledColor() { - return this.disabledColor; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiNumberField.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiNumberField.java deleted file mode 100644 index 75759c0f..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiNumberField.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import com.google.common.base.Preconditions; -import de.johni0702.minecraft.gui.container.GuiContainer; - -import java.util.Locale; -import java.util.regex.Pattern; - -// TODO: This is suboptimal e.g. if there are trailing zeros, they stay (should be fixed after TextField is done w/o MC) -public abstract class AbstractGuiNumberField> - extends AbstractGuiTextField implements IGuiNumberField { - - private int precision; - private volatile Pattern precisionPattern; - - private Double minValue; - - private Double maxValue; - - private boolean validateOnFocusChange = false; - - public AbstractGuiNumberField() { - } - - public AbstractGuiNumberField(GuiContainer container) { - super(container); - } - - { - setValue(0); - } - - @Override - public T setText(String text) { - if (!isTextValid(text, !validateOnFocusChange)) { - throw new IllegalArgumentException(text + " is not a valid number!"); - } - return super.setText(text); - } - - @Override - public T setValidateOnFocusChange(boolean validateOnFocusChange) { - this.validateOnFocusChange = validateOnFocusChange; - return getThis(); - } - - private boolean isSemiZero(String text) { - return text.isEmpty() || "-".equals(text); - } - - private boolean isTextValid(String text, boolean validateRange) { - // Allow empty text to be equal to 0 - if (validateOnFocusChange && isSemiZero(text)) { - // but only if 0 is in range - return !validateRange || valueInRange(0); - } - try { - if (precision == 0) { - int val = Integer.parseInt(text); - return !validateRange || valueInRange(val); - } else { - double val = Double.parseDouble(text); - return !validateRange || (valueInRange(val) && precisionPattern.matcher(text).matches()); - } - } catch (NumberFormatException e) { - return false; - } - } - - private boolean valueInRange(double value) { - return (minValue == null || value >= minValue) && (maxValue == null || value <= maxValue); - } - - @Override - protected void onTextChanged(String from) { - if (isTextValid(getText(), !validateOnFocusChange)) { - super.onTextChanged(from); - } else { - setText(from); - } - } - - @Override - public byte getByte() { - if (validateOnFocusChange && isSemiZero(getText())) { - return 0; - } - return Byte.parseByte(getText()); - } - - @Override - public short getShort() { - if (validateOnFocusChange && isSemiZero(getText())) { - return 0; - } - return Short.parseShort(getText()); - } - - @Override - public int getInteger() { - if (validateOnFocusChange && isSemiZero(getText())) { - return 0; - } - return Integer.parseInt(getText()); - } - - @Override - public long getLong() { - if (validateOnFocusChange && isSemiZero(getText())) { - return 0; - } - return Long.parseLong(getText()); - } - - @Override - public float getFloat() { - if (validateOnFocusChange && isSemiZero(getText())) { - return 0; - } - return Float.parseFloat(getText()); - } - - @Override - public double getDouble() { - if (validateOnFocusChange && isSemiZero(getText())) { - return 0; - } - return Double.parseDouble(getText()); - } - - @Override - public T setValue(int value) { - setText(Integer.toString(value)); - return getThis(); - } - - @Override - public T setValue(double value) { - setText(String.format(Locale.ROOT, "%." + precision + "f", value)); - return getThis(); - } - - @Override - public T setPrecision(int precision) { - Preconditions.checkArgument(precision >= 0, "precision must not be negative"); - precisionPattern = Pattern.compile(String.format("-?[0-9]*+((\\.[0-9]{0,%d})?)||(\\.)?", precision)); - this.precision = precision; - return getThis(); - } - - @Override - public T setMinValue(Double minValue) { - this.minValue = minValue; - return getThis(); - } - - @Override - public T setMaxValue(Double maxValue) { - this.maxValue = maxValue; - return getThis(); - } - - @Override - public T setMinValue(int minValue) { - return setMinValue((double) minValue); - } - - @Override - public T setMaxValue(int maxValue) { - return setMaxValue((double) maxValue); - } - - private double clampToBounds() { - double d = getDouble(); - if (getMinValue() != null && d < getMinValue()) { - return getMinValue(); - } - if (getMaxValue() != null && d > getMaxValue()) { - return getMaxValue(); - } - return d; - } - - @Override - protected void onFocusChanged(boolean focused) { - setValue(clampToBounds()); - super.onFocusChanged(focused); - } - - public Double getMinValue() { - return this.minValue; - } - - public Double getMaxValue() { - return this.maxValue; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiPasswordField.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiPasswordField.java deleted file mode 100644 index 043be86b..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiPasswordField.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import org.apache.commons.lang3.StringUtils; - -public abstract class AbstractGuiPasswordField> extends AbstractGuiTextField { - public AbstractGuiPasswordField() { - } - - public AbstractGuiPasswordField(GuiContainer container) { - super(container); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - String text = getText(); - setText(StringUtils.repeat('*', text.length())); - super.draw(renderer, size, renderInfo); - setText(text); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiSlider.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiSlider.java deleted file mode 100644 index b4701a31..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiSlider.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.function.Draggable; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.client.resource.language.I18n; - -// TODO: Currently assumes a height of 20 -public abstract class AbstractGuiSlider> extends AbstractGuiElement implements Clickable, Draggable, IGuiSlider { - private Runnable onValueChanged; - - private int value; - private int steps; - - private String text = ""; - - private boolean dragging; - - public AbstractGuiSlider() { - } - - public AbstractGuiSlider(GuiContainer container) { - super(container); - } - - @Override - protected ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - - if (isMouseHovering(pos) && isEnabled()) { - updateValue(pos); - dragging = true; - return true; - } - return false; - } - - @Override - public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) { - if (dragging) { - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - updateValue(pos); - } - return dragging; - } - - @Override - public boolean mouseRelease(ReadablePoint position, int button) { - if (dragging) { - dragging = false; - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - updateValue(pos); - return true; - } else { - return false; - } - } - - protected boolean isMouseHovering(ReadablePoint pos) { - return pos.getX() > 0 && pos.getY() > 0 - && pos.getX() < getLastSize().getWidth() && pos.getY() < getLastSize().getHeight(); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - - int width = size.getWidth(); - int height = size.getHeight(); - - renderer.bindTexture(GuiButton.WIDGETS_TEXTURE); - - // Draw background - renderer.drawTexturedRect(0, 0, 0, 46, width / 2, height); - renderer.drawTexturedRect(width / 2, 0, 200 - width / 2, 46, width / 2, height); - - // Draw slider - int sliderX = (width - 8) * value / steps; - renderer.drawTexturedRect(sliderX, 0, 0, 66, 4, 20); - renderer.drawTexturedRect(sliderX + 4, 0, 196, 66, 4, 20); - - // Draw text - int color = 0xe0e0e0; - if (!isEnabled()) { - color = 0xa0a0a0; - } else if (isMouseHovering(new Point(renderInfo.mouseX, renderInfo.mouseY))) { - color = 0xffffa0; - } - renderer.drawCenteredString(width / 2, height / 2 - 4, color, text); - } - - protected void updateValue(ReadablePoint position) { - if (getLastSize() == null) { - return; - } - int width = getLastSize().getWidth() - 8; - int pos = Math.max(0, Math.min(width, position.getX() - 4)); - setValue(steps * pos / width); - } - - public void onValueChanged() { - if (onValueChanged != null) { - onValueChanged.run(); - } - } - - @Override - public T setText(String text) { - this.text = text; - return getThis(); - } - - @Override - public T setI18nText(String text, Object... args) { - return setText(I18n.translate(text, args)); - } - - @Override - public T setValue(int value) { - this.value = value; - onValueChanged(); - return getThis(); - } - - @Override - public int getValue() { - return value; - } - - @Override - public int getSteps() { - return steps; - } - - @Override - public T setSteps(int steps) { - this.steps = steps; - return getThis(); - } - - @Override - public T onValueChanged(Runnable runnable) { - this.onValueChanged = runnable; - return getThis(); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTextField.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTextField.java deleted file mode 100644 index 6b6bd532..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTextField.java +++ /dev/null @@ -1,623 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.function.Focusable; -import de.johni0702.minecraft.gui.function.Tickable; -import de.johni0702.minecraft.gui.function.Typeable; -import de.johni0702.minecraft.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.resource.language.I18n; - -//#if MC>=11400 -import net.minecraft.SharedConstants; -//#else -//$$ import net.minecraft.util.ChatAllowedCharacters; -//$$ import org.lwjgl.input.Keyboard; -//#endif - -import static de.johni0702.minecraft.gui.utils.Utils.clamp; -import static de.johni0702.minecraft.gui.versions.MCVer.*; - -public abstract class AbstractGuiTextField> - extends AbstractGuiElement implements Clickable, Tickable, Typeable, IGuiTextField { - private static final ReadableColor BORDER_COLOR = new Color(160, 160, 160); - private static final ReadableColor CURSOR_COLOR = new Color(240, 240, 240); - private static final int BORDER = 4; - - // Focus - private boolean focused; - private Focusable next, previous; - - // Content - private int maxLength = 32; - - private String text = ""; - - private int cursorPos; - private int selectionPos; - - private String hint; - - // Rendering - private int currentOffset; - private int blinkCursorTick; - private ReadableColor textColorEnabled = new Color(224, 224, 224); - private ReadableColor textColorDisabled = new Color(112, 112, 112); - private ReadableDimension size = new Dimension(0, 0); // Size of last render - - private Consumer textChanged; - private Consumer focusChanged; - private Runnable onEnter; - - public AbstractGuiTextField() { - } - - public AbstractGuiTextField(GuiContainer container) { - super(container); - } - - @Override - public T setText(String text) { - if (text.length() > maxLength) { - text = text.substring(0, maxLength); - } - this.text = text; - selectionPos = cursorPos = text.length(); - return getThis(); - } - - @Override - public T setI18nText(String text, Object... args) { - return setText(I18n.translate(text, args)); - } - - @Override - public T setMaxLength(int maxLength) { - Preconditions.checkArgument(maxLength >= 0, "maxLength must not be negative"); - this.maxLength = maxLength; - if (text.length() > maxLength) { - setText(text); - } - return getThis(); - } - - @Override - public String deleteText(int from, int to) { - Preconditions.checkArgument(from <= to, "from must not be greater than to"); - Preconditions.checkArgument(from >= 0, "from must be greater than zero"); - Preconditions.checkArgument(to < text.length(), "to must be less than test.length()"); - - String deleted = text.substring(from, to + 1); - text = text.substring(0, from) + text.substring(to + 1); - return deleted; - } - - @Override - public int getSelectionFrom() { - return cursorPos > selectionPos ? selectionPos : cursorPos; - } - - @Override - public int getSelectionTo() { - return cursorPos > selectionPos ? cursorPos : selectionPos; - } - - @Override - public String getSelectedText() { - return text.substring(getSelectionFrom(), getSelectionTo()); - } - - @Override - public String deleteSelectedText() { - if (cursorPos == selectionPos) { - return ""; // Nothing selected - } - int from = getSelectionFrom(); - String deleted = deleteText(from, getSelectionTo() - 1); - cursorPos = selectionPos = from; - return deleted; - } - - /** - * Update current text offset to make sure the cursor is always visible. - */ - private void updateCurrentOffset() { - currentOffset = Math.min(currentOffset, cursorPos); - String line = text.substring(currentOffset, cursorPos); - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int currentWidth = fontRenderer.getWidth(line); - if (currentWidth > size.getWidth() - 2*BORDER) { - currentOffset = cursorPos - fontRenderer.trimToWidth(line, size.getWidth() - 2*BORDER, true).length(); - } - } - - @Override - public T writeText(String append) { - for (char c : append.toCharArray()) { - writeChar(c); - } - return getThis(); - } - - @Override - public T writeChar(char c) { - //#if MC>=11400 - if (!SharedConstants.isValidChar(c)) { - //#else - //$$ if (!ChatAllowedCharacters.isAllowedCharacter(c)) { - //#endif - return getThis(); - } - - deleteSelectedText(); - - if (text.length() >= maxLength) { - return getThis(); - } - - text = text.substring(0, cursorPos) + c + text.substring(cursorPos); - selectionPos = ++cursorPos; - - return getThis(); - } - - @Override - public T deleteNextChar() { - if (cursorPos < text.length()) { - text = text.substring(0, cursorPos) + text.substring(cursorPos + 1); - } - selectionPos = cursorPos; - return getThis(); - } - - /** - * Return the amount of characters to the next word (excluding). - * If this is the last word in the line, return the amount of characters remaining to till the end. - * Everything except the Space character is considered part of a word. - * @return Length in characters - */ - protected int getNextWordLength() { - int length = 0; - boolean inWord = true; - for (int i = cursorPos; i < text.length(); i++) { - if (inWord) { - if (text.charAt(i) == ' ') { - inWord = false; - } - } else { - if (text.charAt(i) != ' ') { - return length; - } - } - length++; - } - return length; - } - - @Override - public String deleteNextWord() { - int worldLength = getNextWordLength(); - if (worldLength > 0) { - return deleteText(cursorPos, cursorPos + worldLength - 1); - } - return ""; - } - - @Override - public T deletePreviousChar() { - if (cursorPos > 0) { - text = text.substring(0, cursorPos - 1) + text.substring(cursorPos); - selectionPos = --cursorPos; - } - return getThis(); - } - - /** - * Return the amount of characters to the previous word (including). - * If this is the first word in the line, return the amount of characters till the start. - * Everything except the Space character is considered part of a word. - * @return Length in characters - */ - protected int getPreviousWordLength() { - int length = 0; - boolean inWord = false; - for (int i = cursorPos - 1; i >= 0; i--) { - if (inWord) { - if (text.charAt(i) == ' ') { - return length; - } - } else { - if (text.charAt(i) != ' ') { - inWord = true; - } - } - length++; - } - return length; - } - - @Override - public String deletePreviousWord() { - int worldLength = getPreviousWordLength(); - String deleted = ""; - if (worldLength > 0) { - deleted = deleteText(cursorPos - worldLength, cursorPos - 1); - selectionPos = cursorPos -= worldLength; - } - return deleted; - } - - @Override - public T setCursorPosition(int pos) { - Preconditions.checkArgument(pos >= 0 && pos <= text.length()); - selectionPos = cursorPos = pos; - return getThis(); - } - - @Override - protected ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - if (getContainer() != null) { - getContainer().convertFor(this, (Point) (position = new Point(position))); - } - boolean hovering = isMouseHovering(position); - - if (hovering && isFocused() && button == 0) { - updateCurrentOffset(); - int mouseX = position.getX() - BORDER; - TextRenderer fontRenderer = MCVer.getFontRenderer(); - String text = this.text.substring(currentOffset); - int textX = fontRenderer.trimToWidth(text, mouseX).length() + currentOffset; - setCursorPosition(textX); - return true; - } - - setFocused(hovering); - // Do not yet return true to allow focusables later in the event chain to be notified of the focus change - return false; - } - - protected boolean isMouseHovering(ReadablePoint pos) { - return pos.getX() > 0 && pos.getY() > 0 - && pos.getX() < size.getWidth() && pos.getY() < size.getHeight(); - } - - @Override - public T setFocused(boolean isFocused) { - if (isFocused && !this.focused) { - this.blinkCursorTick = 0; // Restart blinking to indicate successful focus - } - if (this.focused != isFocused) { - this.focused = isFocused; - onFocusChanged(this.focused); - } - return getThis(); - } - - @Override - public T setNext(Focusable next) { - this.next = next; - return getThis(); - } - - @Override - public T setPrevious(Focusable previous) { - this.previous = previous; - return getThis(); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - this.size = size; - updateCurrentOffset(); - super.draw(renderer, size, renderInfo); - - int width = size.getWidth(), height = size.getHeight(); - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int posY = height / 2 - fontRenderer.fontHeight / 2; - - // Draw black rect once pixel smaller than gray rect - renderer.drawRect(0, 0, width, height, isFocused() ? ReadableColor.WHITE : BORDER_COLOR); - renderer.drawRect(1, 1, width - 2, height - 2, ReadableColor.BLACK); - - if (text.isEmpty() && !isFocused() && !Strings.isNullOrEmpty(hint)) { - // Draw hint - String text = fontRenderer.trimToWidth(hint, width - 2*BORDER); - renderer.drawString(BORDER, posY, textColorDisabled, text); - } else { - // Draw text - String renderText = text.substring(currentOffset); - renderText = fontRenderer.trimToWidth(renderText, width - 2*BORDER); - ReadableColor color = isEnabled() ? textColorEnabled : textColorDisabled; - int lineEnd = renderer.drawString(BORDER, height / 2 - fontRenderer.fontHeight / 2, color, renderText); - - // Draw selection - int from = getSelectionFrom(); - int to = getSelectionTo(); - String leftStr = renderText.substring(0, clamp(from - currentOffset, 0, renderText.length())); - String rightStr = renderText.substring(clamp(to - currentOffset, 0, renderText.length())); - int left = BORDER + fontRenderer.getWidth(leftStr); - int right = lineEnd - fontRenderer.getWidth(rightStr) - 1; - renderer.invertColors(right, height - 2, left, 2); - - // Draw cursor - if (blinkCursorTick / 6 % 2 == 0 && focused) { - String beforeCursor = renderText.substring(0, cursorPos - currentOffset); - int posX = BORDER + fontRenderer.getWidth(beforeCursor); - if (cursorPos == text.length()) { - renderer.drawString(posX, posY, CURSOR_COLOR, "_", true); - } else { - renderer.drawRect(posX, posY - 1, 1, 1 + fontRenderer.fontHeight, CURSOR_COLOR); - } - } - } - } - - @Override - public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { - if (!this.focused) { - return false; - } - - if (keyCode == Keyboard.KEY_TAB) { - Focusable other = shiftDown ? previous : next; - if (other != null) { - setFocused(false); - other.setFocused(true); - // If the other field is a text field, by default select all its text (saves a Ctrl+A) - if (other instanceof AbstractGuiTextField) { - AbstractGuiTextField field = (AbstractGuiTextField) other; - field.cursorPos = 0; - field.selectionPos = field.text.length(); - } - } - return true; - } - - if (keyCode == Keyboard.KEY_RETURN) { - onEnter(); - return true; - } - - String textBefore = text; - try { - if (Screen.hasControlDown()) { - switch (keyCode) { - case Keyboard.KEY_A: // Select all - cursorPos = 0; - selectionPos = text.length(); - return true; - case Keyboard.KEY_C: // Copy - MCVer.setClipboardString(getSelectedText()); - return true; - case Keyboard.KEY_V: // Paste - if (isEnabled()) { - writeText(MCVer.getClipboardString()); - } - return true; - case Keyboard.KEY_X: // Cut - if (isEnabled()) { - MCVer.setClipboardString(deleteSelectedText()); - } - return true; - } - } - - boolean words = Screen.hasControlDown(); - boolean select = Screen.hasShiftDown(); - switch (keyCode) { - case Keyboard.KEY_HOME: - cursorPos = 0; - break; - case Keyboard.KEY_END: - cursorPos = text.length(); - break; - case Keyboard.KEY_LEFT: - if (cursorPos != 0) { - if (words) { - cursorPos -= getPreviousWordLength(); - } else { - cursorPos--; - } - } - break; - case Keyboard.KEY_RIGHT: - if (cursorPos != text.length()) { - if (words) { - cursorPos += getNextWordLength(); - } else { - cursorPos++; - } - } - break; - case Keyboard.KEY_BACK: - if (isEnabled()) { - if (getSelectedText().length() > 0) { - deleteSelectedText(); - } else if (words) { - deletePreviousWord(); - } else { - deletePreviousChar(); - } - } - return true; - case Keyboard.KEY_DELETE: - if (isEnabled()) { - if (getSelectedText().length() > 0) { - deleteSelectedText(); - } else if (words) { - deleteNextWord(); - } else { - deleteNextChar(); - } - } - return true; - default: - if (isEnabled()) { - if (keyChar == '\r') { - keyChar = '\n'; - } - writeChar(keyChar); - } - return true; - } - - if (!select) { - selectionPos = cursorPos; - } - return true; - } finally { - if (!textBefore.equals(text)) { - onTextChanged(textBefore); - } - } - } - - @Override - public void tick() { - blinkCursorTick++; - } - - /** - * Called when the user presses the Enter/Return key while this text field is focused. - */ - protected void onEnter() { - if (onEnter != null) { - onEnter.run(); - } - } - - /** - * Called when the text has changed due to user input. - */ - protected void onTextChanged(String from) { - if (textChanged != null) { - textChanged.consume(from); - } - } - - /** - * Called when the element has been focused or unfocused - */ - protected void onFocusChanged(boolean focused) { - if (focusChanged != null) { - focusChanged.consume(focused); - } - } - - @Override - public T onEnter(Runnable onEnter) { - this.onEnter = onEnter; - return getThis(); - } - - @Override - public T onTextChanged(Consumer textChanged) { - this.textChanged = textChanged; - return getThis(); - } - - @Override - public T onFocusChange(Consumer focusChanged) { - this.focusChanged = focusChanged; - return getThis(); - } - - @Override - public T setHint(String hint) { - this.hint = hint; - return getThis(); - } - - @Override - public T setI18nHint(String hint, Object... args) { - return setHint(I18n.translate(hint)); - } - - @Override - public ReadableColor getTextColor() { - return textColorEnabled; - } - - @Override - public T setTextColor(ReadableColor textColor) { - this.textColorEnabled = textColor; - return getThis(); - } - - @Override - public ReadableColor getTextColorDisabled() { - return textColorDisabled; - } - - @Override - public T setTextColorDisabled(ReadableColor textColorDisabled) { - this.textColorDisabled = textColorDisabled; - return getThis(); - } - - public boolean isFocused() { - return this.focused; - } - - public Focusable getNext() { - return this.next; - } - - public Focusable getPrevious() { - return this.previous; - } - - public int getMaxLength() { - return this.maxLength; - } - - public String getText() { - return this.text; - } - - public String getHint() { - return this.hint; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTexturedButton.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTexturedButton.java deleted file mode 100644 index 2dcda7f1..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTexturedButton.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; -import net.minecraft.util.Identifier; - -//#if MC>=10904 -import net.minecraft.sound.SoundEvents; -import net.minecraft.sound.SoundEvent; -//#endif - -//#if MC>=10800 -import static com.mojang.blaze3d.platform.GlStateManager.*; -//#endif -import static de.johni0702.minecraft.gui.versions.MCVer.*; - -import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA; -import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA; - -public abstract class AbstractGuiTexturedButton> extends AbstractGuiClickable implements Clickable, IGuiTexturedButton { - private Identifier texture; - - //#if MC>=10904 - private SoundEvent sound = SoundEvents.UI_BUTTON_CLICK; - //#endif - - private ReadableDimension textureSize = new ReadableDimension() { - @Override - public int getWidth() { - return getMaxSize().getWidth(); - } - - @Override - public int getHeight() { - return getMaxSize().getHeight(); - } - - @Override - public void getSize(WritableDimension dest) { - getMaxSize().getSize(dest); - } - }; - - private ReadableDimension textureTotalSize; - - private ReadablePoint textureNormal; - - private ReadablePoint textureHover; - - private ReadablePoint textureDisabled; - - public AbstractGuiTexturedButton() { - } - - public AbstractGuiTexturedButton(GuiContainer container) { - super(container); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - - renderer.bindTexture(texture); - - ReadablePoint texture = textureNormal; - if (!isEnabled()) { - texture = textureDisabled; - } else if (isMouseHovering(new Point(renderInfo.mouseX, renderInfo.mouseY))) { - texture = textureHover; - } - - if (texture == null) { // Button is disabled but we have no texture for that - color4f(0.5f, 0.5f, 0.5f, 1); - texture = textureNormal; - } - - enableBlend(); - blendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0); - blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - renderer.drawTexturedRect(0, 0, texture.getX(), texture.getY(), size.getWidth(), size.getHeight(), - textureSize.getWidth(), textureSize.getHeight(), - textureTotalSize.getWidth(), textureTotalSize.getHeight()); - } - - @Override - public ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - @Override - public void onClick() { - //#if MC>=10904 - AbstractGuiButton.playClickSound(getMinecraft(), sound); - //#else - //$$ AbstractGuiButton.playClickSound(getMinecraft()); - //#endif - super.onClick(); - } - - @Override - public T setTexture(Identifier resourceLocation, int size) { - return setTexture(resourceLocation, size, size); - } - - @Override - public T setTexture(Identifier resourceLocation, int width, int height) { - this.texture = resourceLocation; - this.textureTotalSize = new Dimension(width, height); - return getThis(); - } - - @Override - public T setTextureSize(int size) { - return setTextureSize(size, size); - } - - @Override - public T setTextureSize(int width, int height) { - this.textureSize = new Dimension(width, height); - return getThis(); - } - - @Override - public T setTexturePosH(final int x, final int y) { - return setTexturePosH(new Point(x, y)); - } - - @Override - public T setTexturePosV(final int x, final int y) { - return setTexturePosV(new Point(x, y)); - } - - @Override - public T setTexturePosH(final ReadablePoint pos) { - this.textureNormal = pos; - this.textureHover = new ReadablePoint() { - @Override - public int getX() { - return pos.getX() + textureSize.getWidth(); - } - - @Override - public int getY() { - return pos.getY(); - } - - @Override - public void getLocation(WritablePoint dest) { - dest.setLocation(getX(), getY()); - } - }; - return getThis(); - } - - @Override - public T setTexturePosV(final ReadablePoint pos) { - this.textureNormal = pos; - this.textureHover = new ReadablePoint() { - @Override - public int getX() { - return pos.getX(); - } - - @Override - public int getY() { - return pos.getY() + textureSize.getHeight(); - } - - @Override - public void getLocation(WritablePoint dest) { - dest.setLocation(getX(), getY()); - } - }; - return getThis(); - } - - @Override - public T setTexturePos(int normalX, int normalY, int hoverX, int hoverY) { - return setTexturePos(new Point(normalX, normalY), new Point(hoverX, hoverY)); - } - - @Override - public T setTexturePos(ReadablePoint normal, ReadablePoint hover) { - this.textureNormal = normal; - this.textureHover = hover; - return getThis(); - } - - @Override - public T setTexturePos(int normalX, int normalY, int hoverX, int hoverY, int disabledX, int disabledY) { - return setTexturePos(new Point(normalX, normalY), new Point(hoverX, hoverY), new Point(disabledX, disabledY)); - } - - @Override - public T setTexturePos(ReadablePoint normal, ReadablePoint hover, ReadablePoint disabled) { - this.textureDisabled = disabled; - return setTexturePos(normal, hover); - } - - //#if MC>=10904 - @Override - public T setSound(SoundEvent sound) { - this.sound = sound; - return getThis(); - } - - public SoundEvent getSound() { - return this.sound; - } - //#endif - - public Identifier getTexture() { - return this.texture; - } - - public ReadableDimension getTextureSize() { - return this.textureSize; - } - - public ReadableDimension getTextureTotalSize() { - return this.textureTotalSize; - } - - public ReadablePoint getTextureNormal() { - return this.textureNormal; - } - - public ReadablePoint getTextureHover() { - return this.textureHover; - } - - public ReadablePoint getTextureDisabled() { - return this.textureDisabled; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiToggleButton.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiToggleButton.java deleted file mode 100644 index c1188a87..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiToggleButton.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; - -public abstract class AbstractGuiToggleButton> - extends AbstractGuiButton implements IGuiToggleButton { - - private int selected; - - private V[] values; - - public AbstractGuiToggleButton() { - } - - public AbstractGuiToggleButton(GuiContainer container) { - super(container); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - String orgLabel = getLabel(); - setLabel(orgLabel + ": " + values[selected]); - super.draw(renderer, size, renderInfo); - setLabel(orgLabel); - } - - @Override - public void onClick() { - selected = (selected + 1) % values.length; - super.onClick(); - } - - @Override - public T setValues(V... values) { - this.values = values; - return getThis(); - } - - @Override - public T setSelected(int selected) { - this.selected = selected; - return getThis(); - } - - @Override - public V getSelectedValue() { - return values[selected]; - } - - public int getSelected() { - return this.selected; - } - - public V[] getValues() { - return this.values; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTooltip.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTooltip.java deleted file mode 100644 index 78773a29..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/AbstractGuiTooltip.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.utils.StringUtils; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; - -public abstract class AbstractGuiTooltip> extends AbstractGuiElement { - private static final int LINE_SPACING = 3; - private static final ReadableColor BACKGROUND_COLOR = new Color(16, 0, 16, 240); - private static final ReadableColor BORDER_LIGHT = new Color(80, 0, 255, 80); - private static final ReadableColor BORDER_DARK = new Color(40, 0, 127, 80); - - private String[] text = {}; - - private ReadableColor color = ReadableColor.WHITE; - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - - int width = size.getWidth(); - int height = size.getHeight(); - - // Draw background - renderer.drawRect(1, 0, width - 2, height, BACKGROUND_COLOR); // Top to bottom - renderer.drawRect(0, 1, 1, height - 2, BACKGROUND_COLOR); // Left pixel row - renderer.drawRect(width - 1, 1, 1, height - 2, BACKGROUND_COLOR); // Right pixel row - - // Draw the border, it gets darker from top to bottom - renderer.drawRect(1, 1, width - 2, 1, BORDER_LIGHT); // Top border - renderer.drawRect(1, height - 2, width - 2, 1, BORDER_DARK); // Bottom border - renderer.drawRect(1, 2, 1, height - 4, BORDER_LIGHT, BORDER_LIGHT, BORDER_DARK, BORDER_DARK); // Left border - renderer.drawRect(width - 2, 2, 1, height - 4, BORDER_LIGHT, BORDER_LIGHT, BORDER_DARK, BORDER_DARK); // Right border - - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int y = LINE_SPACING + 1; - for (String line : text) { - renderer.drawString(LINE_SPACING + 1, y, color, line, true); - y += fontRenderer.fontHeight + LINE_SPACING; - } - } - - @Override - public ReadableDimension calcMinSize() { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int height = 1 + LINE_SPACING + text.length * (fontRenderer.fontHeight + LINE_SPACING); - int width = 0; - for (String line : text) { - int w = fontRenderer.getWidth(line); - if (w > width) { - width = w; - } - } - width+=4 * 2; - return new Dimension(width, height); - } - - @Override - public ReadableDimension getMaxSize() { - return getMinSize(); - } - - public T setText(String[]text) { - this.text = text; - return getThis(); - } - - public T setText(String text) { - return setText(StringUtils.splitStringInMultipleRows(text, 250)); - } - - public T setI18nText(String text, Object... args) { - return setText(I18n.translate(text, args)); - } - - public T setColor(ReadableColor color) { - this.color = color; - return getThis(); - } - - public String[] getText() { - return this.text; - } - - public ReadableColor getColor() { - return this.color; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/ComposedGuiElement.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/ComposedGuiElement.java deleted file mode 100644 index ba8c51e3..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/ComposedGuiElement.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import java.util.Collection; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; - -public interface ComposedGuiElement> extends GuiElement { - Collection getChildren(); - - default R forEach(Class ofType, Function function) { - return forEach((elem, elemLayer) -> elem.forEach(elemLayer, ofType, function)); - } - - default R forEach(BiFunction, Integer, R> recurse) { - int maxLayer = getMaxLayer(); - for (int i = maxLayer; i >= 0; i--) { - R result = recurse.apply(this, i); - if (result != null) { - return result; - } - } - return null; - } - - default R forEach(int layer, Class ofType, Function function) { - return forEach(layer, ofType, (elem, elemLayer) -> elem.forEach(elemLayer, ofType, function), function); - } - - R forEach(int layer, Class ofType, BiFunction, Integer, R> recurse, Function function); - - default void invokeAll(Class ofType, Consumer consumer) { - forEach((elem, elemLayer) -> { - elem.invokeAll(elemLayer, ofType, consumer); - return null; - }); - } - - default void invokeAll(int layer, Class ofType, Consumer consumer) { - forEach(layer, ofType, (elem, elemLayer) -> { - elem.invokeAll(elemLayer, ofType, consumer); - return null; - }, obj -> { - consumer.accept(obj); - return null; - }); - } - - default boolean invokeHandlers(Class ofType, Function handle) { - return forEach((elem, elemLayer) -> elem.invokeHandlers(elemLayer, ofType, handle) ? true : null) == Boolean.TRUE; - } - - default boolean invokeHandlers(int layer, Class ofType, Function handle) { - return forEach( - layer, - ofType, - (elem, elemLayer) -> elem.invokeHandlers(elemLayer, ofType, handle) ? true : null, - obj -> handle.apply(obj) ? true : null - ) == Boolean.TRUE; - } - - /** - * Returns the highest layer this element or any of its children take part in. - * Events will be called for this composed jgui element for all layers between - * layer 0 (inclusive) and the returned maximum layer (inclusive). - * @return Highest layer relevant to this element - */ - int getMaxLayer(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiButton.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiButton.java deleted file mode 100644 index b8ef4327..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiButton.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiButton extends AbstractGuiButton { - public GuiButton() { - } - - public GuiButton(GuiContainer container) { - super(container); - } - - @Override - protected GuiButton getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiCheckbox.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiCheckbox.java deleted file mode 100644 index cbedc7d9..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiCheckbox.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiCheckbox extends AbstractGuiCheckbox { - public GuiCheckbox() { - } - - public GuiCheckbox(GuiContainer container) { - super(container); - } - - @Override - protected GuiCheckbox getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiElement.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiElement.java deleted file mode 100644 index 907676fa..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiElement.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.MinecraftClient; - -public interface GuiElement> { - - MinecraftClient getMinecraft(); - - GuiContainer getContainer(); - T setContainer(GuiContainer container); - - void layout(ReadableDimension size, RenderInfo renderInfo); - void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo); - - ReadableDimension getMinSize(); - ReadableDimension getMaxSize(); - - T setMaxSize(ReadableDimension maxSize); - - boolean isEnabled(); - T setEnabled(boolean enabled); - T setEnabled(); - T setDisabled(); - - GuiElement getTooltip(RenderInfo renderInfo); - T setTooltip(GuiElement tooltip); - - /** - * Returns the layer this element takes part in. - * The standard layer is layer 0. Event handlers will be called for this layer. - * @return The layer of this element - */ - int getLayer(); - -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiHorizontalScrollbar.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiHorizontalScrollbar.java deleted file mode 100644 index 0db9099f..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiHorizontalScrollbar.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiHorizontalScrollbar extends AbstractGuiHorizontalScrollbar { - public GuiHorizontalScrollbar() { - } - - public GuiHorizontalScrollbar(GuiContainer container) { - super(container); - } - - @Override - protected GuiHorizontalScrollbar getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiImage.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiImage.java deleted file mode 100644 index 7000b85a..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiImage.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiImage extends AbstractGuiImage { - public GuiImage() { - } - - public GuiImage(GuiContainer container) { - super(container); - } - - public GuiImage(GuiImage copyOf) { - super(copyOf); - } - - @Override - protected GuiImage getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiLabel.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiLabel.java deleted file mode 100644 index 70d16434..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiLabel.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiLabel extends AbstractGuiLabel { - public GuiLabel() { - } - - public GuiLabel(GuiContainer container) { - super(container); - } - - @Override - protected GuiLabel getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiNumberField.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiNumberField.java deleted file mode 100644 index 3cd675e0..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiNumberField.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiNumberField extends AbstractGuiNumberField { - public GuiNumberField() { - } - - public GuiNumberField(GuiContainer container) { - super(container); - } - - @Override - protected GuiNumberField getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiPasswordField.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiPasswordField.java deleted file mode 100644 index 054e3ff2..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiPasswordField.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiPasswordField extends AbstractGuiPasswordField { - public GuiPasswordField() { - } - - public GuiPasswordField(GuiContainer container) { - super(container); - } - - @Override - protected GuiPasswordField getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiSlider.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiSlider.java deleted file mode 100644 index 97777ba0..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiSlider.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiSlider extends AbstractGuiSlider { - public GuiSlider() { - } - - public GuiSlider(GuiContainer container) { - super(container); - } - - @Override - protected GuiSlider getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTextField.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTextField.java deleted file mode 100644 index 6413f483..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTextField.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiTextField extends AbstractGuiTextField { - public GuiTextField() { - } - - public GuiTextField(GuiContainer container) { - super(container); - } - - @Override - protected GuiTextField getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTexturedButton.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTexturedButton.java deleted file mode 100644 index 841cb8ec..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTexturedButton.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiTexturedButton extends AbstractGuiTexturedButton { - public GuiTexturedButton() { - } - - public GuiTexturedButton(GuiContainer container) { - super(container); - } - - @Override - protected GuiTexturedButton getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiToggleButton.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiToggleButton.java deleted file mode 100644 index 3dbfc3fa..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiToggleButton.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiToggleButton extends AbstractGuiToggleButton> { - public GuiToggleButton() { - } - - public GuiToggleButton(GuiContainer container) { - super(container); - } - - @Override - protected GuiToggleButton getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTooltip.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTooltip.java deleted file mode 100644 index 363ecf6e..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/GuiTooltip.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -public class GuiTooltip extends AbstractGuiTooltip { - @Override - protected GuiTooltip getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiButton.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiButton.java deleted file mode 100644 index 4d7651dc..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiButton.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.util.Identifier; - -//#if MC>=10904 -import net.minecraft.sound.SoundEvent; -//#endif - -public interface IGuiButton> extends IGuiClickable { - T setLabel(String label); - - T setI18nLabel(String label, Object... args); - - //#if MC>=10904 - T setSound(SoundEvent sound); - //#endif - - String getLabel(); - - Identifier getTexture(); - T setTexture(Identifier identifier); - - ReadableDimension getTextureSize(); - T setTextureSize(ReadableDimension size); - default T setTextureSize(int width, int height) { - return setTextureSize(new Dimension(width, height)); - } - default T setTextureSize(int size) { - return setTextureSize(size, size); - } - - default T setTexture(Identifier identifier, int width, int height) { - return setTexture(identifier).setTextureSize(width, height); - } - default T setTexture(Identifier resourceLocation, int size) { - return setTexture(resourceLocation, size, size); - } - - T setSpriteUV(ReadablePoint uv); - ReadablePoint getSpriteUV(); - default T setSpriteUV(int u, int v) { - return setSpriteUV(new Point(u, v)); - } - - T setSpriteSize(ReadableDimension size); - ReadableDimension getSpriteSize(); - default T setSpriteSize(int width, int height) { - return setSpriteSize(new Dimension(width, height)); - } - - default T setSprite(int u, int v, int width, int height) { - return setSpriteUV(u, v).setSpriteSize(width, height); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiCheckbox.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiCheckbox.java deleted file mode 100644 index 8b64c4de..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiCheckbox.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -public interface IGuiCheckbox> extends IGuiClickable { - T setLabel(String label); - - T setI18nLabel(String label, Object... args); - - T setChecked(boolean checked); - - String getLabel(); - - boolean isChecked(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiClickable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiClickable.java deleted file mode 100644 index 7d77fc07..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiClickable.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -public interface IGuiClickable> extends GuiElement { - T onClick(Runnable onClick); - Runnable getOnClick(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiHorizontalScrollbar.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiHorizontalScrollbar.java deleted file mode 100644 index 89df6e72..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiHorizontalScrollbar.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -public interface IGuiHorizontalScrollbar> extends GuiElement { - /** - * Set the position of the scrollbar. - * @param pos Position between 0 (inclusive) and 1-zoom (inclusive) - * @return {@code this}, for chaining - */ - T setPosition(double pos); - - /** - * Returns the position of the scrollbar. - * @return Position between 0 (inclusive) and 1-zoom (inclusive) - */ - double getPosition(); - - /** - * Set the zoom of the scrollbar where 1 is zoomed out completely - * and 0 would be zoomed in infinitely far. - * @param zoom Zoom between 1 (inclusive) and 0 (exclusive) - * @return {@code this}, for chaining - */ - T setZoom(double zoom); - - /** - * Returns the zoom of the scrollbar where 1 is zoomed out completely - * and 0 would be zoomed in infinitely far. - * @return Zoom between 1 (inclusive) and 0 (exclusive) - */ - double getZoom(); - - /** - * Sets the runnable called when the position or zoom of the scrollbar changed. - * @param runnable The Runnable to be called - * @return {@code this}, for chaining - */ - T onValueChanged(Runnable runnable); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiImage.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiImage.java deleted file mode 100644 index 966a4ed8..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiImage.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.versions.Image; -import net.minecraft.util.Identifier; - -public interface IGuiImage> extends GuiElement { - T setTexture(Image img); - T setTexture(Identifier resourceLocation); - T setTexture(Identifier resourceLocation, int u, int v, int width, int height); - - T setU(int u); - T setV(int v); - T setUV(int u, int v); - - T setUWidth(int width); - T setVHeight(int height); - T setUVSize(int width, int height); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiLabel.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiLabel.java deleted file mode 100644 index 76a1ea7d..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiLabel.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; - -public interface IGuiLabel> extends GuiElement { - T setText(String text); - - T setI18nText(String text, Object... args); - - T setColor(ReadableColor color); - - T setDisabledColor(ReadableColor disabledColor); - - String getText(); - - ReadableColor getColor(); - - ReadableColor getDisabledColor(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiNumberField.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiNumberField.java deleted file mode 100644 index 8d2bdd4e..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiNumberField.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -public interface IGuiNumberField> extends IGuiTextField { - byte getByte(); - short getShort(); - int getInteger(); - long getLong(); - float getFloat(); - double getDouble(); - - T setValue(int value); - T setValue(double value); - - T setMinValue(Double minValue); - T setMaxValue(Double maxValue); - - T setMinValue(int minValue); - T setMaxValue(int maxValue); - - T setValidateOnFocusChange(boolean validateOnFocusChange); - - /** - * Sets the amount of digits allowed after the decimal point. - * A value of {@code 0} is equal to integer precision. - * Negative values are not allowed. - * @param precision Number of digits allowed - */ - T setPrecision(int precision); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiSlider.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiSlider.java deleted file mode 100644 index 68ee960e..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiSlider.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -public interface IGuiSlider> extends GuiElement { - T setText(String text); - T setI18nText(String text, Object... args); - - T setValue(int value); - int getValue(); - - int getSteps(); - T setSteps(int steps); - - T onValueChanged(Runnable runnable); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiTextField.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiTextField.java deleted file mode 100644 index f63ebdeb..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiTextField.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.function.Focusable; -import de.johni0702.minecraft.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.NonNull; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; - -public interface IGuiTextField> extends GuiElement, Focusable { - /** - * Set the text to the specified string. - * If the string is longer than {@link #getMaxLength()} it is truncated from the end. - * This method positions the cursor at the end of the text and removes any selections. - * @param text The new text - * @return {@code this} for chaining - */ - @NonNull T setText(String text); - - /** - * Set the text to the specified string. - * If the string is longer than {@link #getMaxLength()} it is truncated from the end. - * This method positions the cursor at the end of the text and removes any selections. - * @param text The language key for the new text - * @param args The arguments used in translating the language key - * @return {@code this} for chaining - */ - @NonNull T setI18nText(String text, Object... args); - - /** - * Return the whole text in this text field. - * @return The text, may be empty - */ - @NonNull String getText(); - - /** - * Return the maximum allowed length of the text in this text field. - * @return Maximum number of characters - */ - int getMaxLength(); - - /** - * Set the maximum allowed length of the text in this text field. - * If the current test is longer than the new limit, it is truncated from the end (the cursor and selection - * are reset in that process, see {@link #setText(String)}). - * @param maxLength Maximum number of characters - * @return {@code this} for chaining - * @throws IllegalArgumentException When {@code maxLength} is negative - */ - T setMaxLength(int maxLength); - - /** - * Deletes the text between {@code from} and {@code to} (inclusive). - * @param from Index at which to start - * @param to Index to which to delete - * @return The deleted text - * @throws IllegalArgumentException If {@code from} is greater than {@code to} or either is out of bounds - */ - @NonNull String deleteText(int from, int to); - - /** - * Return the index at which the selection starts (inclusive) - * @return Index of first character - */ - int getSelectionFrom(); - - /** - * Return the index at which the selection ends (exclusive) - * @return Index after the last character - */ - int getSelectionTo(); - - /** - * Return the selected text. - * @return The selected text - */ - @NonNull String getSelectedText(); - - /** - * Delete the selected text. Positions the cursor at the beginning of the selection and clears the selection. - * @return The deleted text - */ - @NonNull String deleteSelectedText(); - - /** - * Appends the specified string to this text field character by character. - * Excess characters are ignored. - * @param append String to append - * @return {@code this} for chaining - * @see #writeChar(char) - */ - @NonNull T writeText(String append); - - /** - * Appends the specified character to this text field replacing the current selection (if any). - * This does nothing if the maximum character limit is reached. - * @param c Character to append - * @return {@code this} for chaining - */ - @NonNull T writeChar(char c); - - /** - * Delete the nex character (if any). - * Clears the selection. - * @return {@code this} for chaining - */ - T deleteNextChar(); - - /** - * Delete everything from the cursor (inclusive) to the beginning of the next word (exclusive). - * If there are no more words, delete everything until the end of the line. - * @return The deleted text - */ - String deleteNextWord(); - - /** - * Delete the previous character (if any). - * @return {@code this} for chaining - */ - @NonNull T deletePreviousChar(); - - /** - * Delete everything from cursor to the first character of the previous word (or the start of the line). - * @return The deleted text - */ - @NonNull String deletePreviousWord(); - - /** - * Set the cursor position. - * @param pos Position of the cursor - * @return {@code this} for chaining - * @throws IllegalArgumentException If {@code pos} < 0 or pos > length - */ - @NonNull T setCursorPosition(int pos); - - T onEnter(Runnable onEnter); - T onTextChanged(Consumer textChanged); - - String getHint(); - T setHint(String hint); - T setI18nHint(String hint, Object... args); - - ReadableColor getTextColor(); - T setTextColor(ReadableColor textColor); - ReadableColor getTextColorDisabled(); - T setTextColorDisabled(ReadableColor textColorDisabled); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiTexturedButton.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiTexturedButton.java deleted file mode 100644 index 9efc43a0..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiTexturedButton.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import net.minecraft.util.Identifier; -//#if MC>=10904 -import net.minecraft.sound.SoundEvent; -//#endif - -public interface IGuiTexturedButton> extends IGuiClickable { - Identifier getTexture(); - ReadableDimension getTextureTotalSize(); - T setTexture(Identifier resourceLocation, int size); - T setTexture(Identifier resourceLocation, int width, int height); - - ReadableDimension getTextureSize(); - T setTextureSize(int size); - T setTextureSize(int width, int height); - - ReadablePoint getTextureNormal(); - ReadablePoint getTextureHover(); - ReadablePoint getTextureDisabled(); - T setTexturePosH(int x, int y); - T setTexturePosV(int x, int y); - T setTexturePosH(ReadablePoint pos); - T setTexturePosV(ReadablePoint pos); - T setTexturePos(int normalX, int normalY, int hoverX, int hoverY); - T setTexturePos(ReadablePoint normal, ReadablePoint hover); - T setTexturePos(int normalX, int normalY, int hoverX, int hoverY, int disabledX, int disabledY); - T setTexturePos(ReadablePoint normal, ReadablePoint hover, ReadablePoint disabled); - - //#if MC>=10904 - T setSound(SoundEvent sound); - //#endif -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiToggleButton.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiToggleButton.java deleted file mode 100644 index 06ff05ae..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/IGuiToggleButton.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element; - -public interface IGuiToggleButton> extends IGuiButton { - T setValues(V[] values); - - T setSelected(int selected); - - V getSelectedValue(); - - int getSelected(); - - V[] getValues(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiColorPicker.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiColorPicker.java deleted file mode 100644 index 74b46326..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiColorPicker.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.OffsetGuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.AbstractComposedGuiElement; -import de.johni0702.minecraft.gui.element.AbstractGuiElement; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.function.Draggable; -import de.johni0702.minecraft.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -import java.util.Collection; -import java.util.Collections; - -public abstract class AbstractGuiColorPicker> - extends AbstractComposedGuiElement implements IGuiColorPicker, Clickable { - protected static final int PICKER_SIZE = 100; - private static final ReadableColor OUTLINE_COLOR = new Color(255, 255, 255); - - private Color color = new Color(); - - private boolean opened; - - private Consumer onSelection; - - private GuiPicker picker = new GuiPicker(); - - public AbstractGuiColorPicker() { - } - - public AbstractGuiColorPicker(GuiContainer container) { - super(container); - } - - @Override - public int getMaxLayer() { - return opened ? 1 : 0; - } - - @Override - protected ReadableDimension calcMinSize() { - return new Dimension(3, 3); - } - - @Override - public void layout(ReadableDimension size, RenderInfo renderInfo) { - super.layout(size, renderInfo); - if (size == null) return; - if (renderInfo.layer == 1) { - ReadableDimension offsetSize = new Dimension(PICKER_SIZE, PICKER_SIZE); - picker.layout(offsetSize, renderInfo); - } - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - if (renderInfo.layer == 0) { - int width = size.getWidth(); - int height = size.getHeight(); - - // Draw outline - renderer.drawRect(0, 0, width, height, OUTLINE_COLOR); - // Draw color - renderer.drawRect(1, 1, width - 2, height - 2, color); - } else if (renderInfo.layer == 1) { - ReadablePoint offsetPoint = new Point(0, size.getHeight()); - ReadableDimension offsetSize = new Dimension(PICKER_SIZE, PICKER_SIZE); - OffsetGuiRenderer offsetRenderer = new OffsetGuiRenderer(renderer, offsetPoint, offsetSize); - offsetRenderer.startUsing(); - try { - picker.draw(offsetRenderer, offsetSize, renderInfo); - } finally { - offsetRenderer.stopUsing(); - } - } - } - - protected void getColorAtPosition(int x, int y, Color color) { - if (x < 0 || y < 0 || x >= PICKER_SIZE || y >= PICKER_SIZE) { - throw new IndexOutOfBoundsException(); - } - - if (x < 5) { // Grey - int intensity = 255 - y * 255 / PICKER_SIZE; - color.set(intensity, intensity, intensity); - } else { // Colored - float hue = (x - 5f) / (PICKER_SIZE - 5f); - float saturation = Math.min(y / (PICKER_SIZE / 2f), 1); - float brightness = Math.min(2 - y / (PICKER_SIZE / 2f), 1); - color.fromHSB(hue, saturation, brightness); - } - } - - @Override - public T setColor(ReadableColor color) { - this.color.setColor(color); - return getThis(); - } - - @Override - public T setOpened(boolean opened) { - this.opened = opened; - return getThis(); - } - - @Override - public Collection getChildren() { - return opened ? Collections.singleton(picker) : Collections.emptyList(); - } - - @Override - public T onSelection(Consumer consumer) { - this.onSelection = consumer; - return getThis(); - } - - public void onSelection(Color oldColor) { - if (onSelection != null) { - onSelection.consume(oldColor); - } - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - - if (isEnabled()) { - if (isMouseHovering(pos)) { - setOpened(!isOpened()); - return true; - } - } - return false; - } - - protected boolean isMouseHovering(ReadablePoint pos) { - return pos.getX() > 0 && pos.getY() > 0 - && pos.getX() < getLastSize().getWidth() && pos.getY() < getLastSize().getHeight(); - } - - public Color getColor() { - return this.color; - } - - public boolean isOpened() { - return this.opened; - } - - protected class GuiPicker extends AbstractGuiElement implements Clickable, Draggable { - private boolean dragging; - - @Override - protected GuiPicker getThis() { - return this; - } - - @Override - public int getLayer() { - return 1; - } - - @Override - protected ReadableDimension calcMinSize() { - return new Dimension(PICKER_SIZE, PICKER_SIZE); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - Color color = new Color(); - for (int x = 0; x < PICKER_SIZE; x++) { - for (int y = 0; y < PICKER_SIZE; y++) { - getColorAtPosition(x, y, color); - renderer.drawRect(x, y, 1, 1, color); - } - } - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - if (isEnabled()) { - Point pos = new Point(position); - AbstractGuiColorPicker parent = AbstractGuiColorPicker.this; - if (parent.getContainer() != null) { - parent.getContainer().convertFor(parent, pos, 1); - } - pos.translate(0, -AbstractGuiColorPicker.this.getLastSize().getHeight()); - - if (isMouseHovering(pos)) { - Color oldColor = new Color(color); - getColorAtPosition(pos.getX(), pos.getY(), color); - dragging = true; - onSelection(oldColor); - return true; - } - } - return false; - } - - @Override - public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) { - return dragging && mouseClick(position, button); - } - - @Override - public boolean mouseRelease(ReadablePoint position, int button) { - if (dragging) { - dragging = false; - return true; - } - return false; - } - - protected boolean isMouseHovering(ReadablePoint pos) { - return pos.getX() > 0 && pos.getY() > 0 - && pos.getX() < PICKER_SIZE && pos.getY() < PICKER_SIZE; - } - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiDropdownMenu.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiDropdownMenu.java deleted file mode 100644 index 76965ff6..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiDropdownMenu.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.OffsetGuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.container.GuiPanel; -import de.johni0702.minecraft.gui.element.AbstractComposedGuiElement; -import de.johni0702.minecraft.gui.element.AbstractGuiClickable; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.element.IGuiClickable; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.layout.VerticalLayout; -import de.johni0702.minecraft.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; - -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.function.Function; - -public abstract class AbstractGuiDropdownMenu> - extends AbstractComposedGuiElement implements IGuiDropdownMenu, Clickable { - private static final ReadableColor OUTLINE_COLOR = new Color(160, 160, 160); - - private int selected; - - private V[] values; - - private boolean opened; - - private Consumer onSelection; - - private GuiPanel dropdown; - - private Map unmodifiableDropdownEntries; - - private Function toString = Object::toString; - - public AbstractGuiDropdownMenu() { - } - - public AbstractGuiDropdownMenu(GuiContainer container) { - super(container); - } - - @Override - public int getMaxLayer() { - return opened ? 1 : 0; - } - - @Override - protected ReadableDimension calcMinSize() { - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int maxWidth = 0; - for (V value : values) { - int width = fontRenderer.getWidth(toString.apply(value)); - if (width > maxWidth) { - maxWidth = width; - } - } - return new Dimension(11 + maxWidth + fontRenderer.fontHeight, fontRenderer.fontHeight + 4); - } - - @Override - public void layout(ReadableDimension size, RenderInfo renderInfo) { - super.layout(size, renderInfo); - TextRenderer fontRenderer = MCVer.getFontRenderer(); - if (renderInfo.layer == 1) { - ReadablePoint offsetPoint = new Point(0, size.getHeight()); - ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.fontHeight + 5) * values.length); - dropdown.layout(offsetSize, renderInfo.offsetMouse(0, offsetPoint.getY()).layer(0)); - } - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - TextRenderer fontRenderer = MCVer.getFontRenderer(); - if (renderInfo.layer == 0) { - int width = size.getWidth(); - int height = size.getHeight(); - - // Draw box - renderer.drawRect(0, 0, width, height, OUTLINE_COLOR); - renderer.drawRect(1, 1, width - 2, height - 2, ReadableColor.BLACK); - renderer.drawRect(width - height, 0, 1, height, OUTLINE_COLOR); - - // Draw triangle - int base = height - 6; - int tHeight = base / 2; - int x = width - 3 - base / 2; - int y = height / 2 - 2; - for (int layer = tHeight; layer > 0; layer--) { - renderer.drawRect(x - layer, y + (tHeight - layer), layer * 2 - 1, 1, OUTLINE_COLOR); - } - - renderer.drawString(3, height / 2 - fontRenderer.fontHeight / 2, ReadableColor.WHITE, toString.apply(getSelectedValue())); - } else if (renderInfo.layer == 1) { - ReadablePoint offsetPoint = new Point(0, size.getHeight()); - ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.fontHeight + 5) * values.length); - OffsetGuiRenderer offsetRenderer = new OffsetGuiRenderer(renderer, offsetPoint, offsetSize); - offsetRenderer.startUsing(); - try { - dropdown.draw(offsetRenderer, offsetSize, renderInfo.offsetMouse(0, offsetPoint.getY()).layer(0)); - } finally { - offsetRenderer.stopUsing(); - } - } - } - - @Override - public T setValues(V... values) { - this.values = values; - dropdown = new GuiPanel(){ - @Override - public void convertFor(GuiElement element, Point point, int relativeLayer) { - AbstractGuiDropdownMenu parent = AbstractGuiDropdownMenu.this; - if (parent.getContainer() != null) { - parent.getContainer().convertFor(parent, point, relativeLayer + 1); - } - point.translate(0, -AbstractGuiDropdownMenu.this.getLastSize().getHeight()); - super.convertFor(element, point, relativeLayer); - } - }.setLayout(new VerticalLayout()); - Map dropdownEntries = new LinkedHashMap<>(); - for (V value : values) { - DropdownEntry entry = new DropdownEntry(value); - dropdownEntries.put(value, entry); - dropdown.addElements(null, entry); - } - unmodifiableDropdownEntries = Collections.unmodifiableMap(dropdownEntries); - return getThis(); - } - - @Override - public T setSelected(int selected) { - this.selected = selected; - onSelection(selected); - return getThis(); - } - - @Override - public T setSelected(V value) { - for (int i = 0; i < values.length; i++) { - if (values[i].equals(value)) { - return setSelected(i); - } - } - throw new IllegalArgumentException("The value " + value + " is not in this dropdown menu."); - } - - @Override - public V getSelectedValue() { - return values[selected]; - } - - @Override - public T setOpened(boolean opened) { - this.opened = opened; - return getThis(); - } - - @Override - public Collection getChildren() { - return opened ? Collections.singletonList(dropdown) : Collections.emptyList(); - } - - @Override - public T onSelection(Consumer consumer) { - this.onSelection = consumer; - return getThis(); - } - - public void onSelection(Integer value) { - if (onSelection != null) { - onSelection.consume(value); - } - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - Point pos = new Point(position); - if (getContainer() != null) { - getContainer().convertFor(this, pos); - } - - if (isEnabled()) { - if (isMouseHovering(pos)) { - setOpened(!isOpened()); - return true; - } - } - return false; - } - - protected boolean isMouseHovering(ReadablePoint pos) { - return pos.getX() > 0 && pos.getY() > 0 - && pos.getX() < getLastSize().getWidth() && pos.getY() < getLastSize().getHeight(); - } - - @Override - public Map getDropdownEntries() { - return unmodifiableDropdownEntries; - } - - @Override - public T setToString(Function toString) { - this.toString = toString; - return getThis(); - } - - public int getSelected() { - return this.selected; - } - - public V[] getValues() { - return this.values; - } - - public boolean isOpened() { - return this.opened; - } - - private class DropdownEntry extends AbstractGuiClickable { - private final V value; - - public DropdownEntry(V value) { - this.value = value; - } - - @Override - protected DropdownEntry getThis() { - return this; - } - - @Override - protected ReadableDimension calcMinSize() { - return new Dimension(0, MCVer.getFontRenderer().fontHeight + 5); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - int width = size.getWidth(); - int height = size.getHeight(); - - renderer.drawRect(0, 0, width, height, OUTLINE_COLOR); - renderer.drawRect(1, 0, width - 2, height - 1, ReadableColor.BLACK); - renderer.drawString(3, 2, ReadableColor.WHITE, toString.apply(value)); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - boolean result = super.mouseClick(position, button); - setOpened(false); - return result; - } - - @Override - protected void onClick() { - setSelected(value); - } - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiProgressBar.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiProgressBar.java deleted file mode 100644 index 10336d0c..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiProgressBar.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.AbstractGuiElement; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.resource.language.I18n; - -public abstract class AbstractGuiProgressBar> extends AbstractGuiElement implements IGuiProgressBar { - private static final int BORDER = 2; - - private float progress; - - private String label = "%d%%"; - - public AbstractGuiProgressBar() { - } - - public AbstractGuiProgressBar(GuiContainer container) { - super(container); - } - - @Override - public T setProgress(float progress) { - this.progress = progress; - return getThis(); - } - - @Override - public T setLabel(String label) { - this.label = label; - return getThis(); - } - - @Override - public T setI18nLabel(String label, Object... args) { - return setLabel(I18n.translate(label, args)); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int width = size.getWidth(); - int height = size.getHeight(); - int barTotalWidth = width - 2 * BORDER; - int barDoneWidth = (int) (barTotalWidth * progress); - - renderer.drawRect(0, 0, width, height, ReadableColor.BLACK); // Border - renderer.drawRect(BORDER, BORDER, barTotalWidth, height - 2 * BORDER, ReadableColor.WHITE); // Background - renderer.drawRect(BORDER, BORDER, barDoneWidth, height - 2 * BORDER, ReadableColor.GREY); // Progress - - String text = String.format(label, (int)(progress * 100)); - renderer.drawCenteredString(width / 2, size.getHeight() / 2 - fontRenderer.fontHeight / 2, ReadableColor.BLACK, text); - } - - @Override - public ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - public float getProgress() { - return this.progress; - } - - public String getLabel() { - return this.label; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiResourceLoadingList.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiResourceLoadingList.java deleted file mode 100644 index c4f350cf..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiResourceLoadingList.java +++ /dev/null @@ -1,281 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.AbstractGuiVerticalList; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.container.GuiPanel; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.element.GuiLabel; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.function.Closeable; -import de.johni0702.minecraft.gui.function.Loadable; -import de.johni0702.minecraft.gui.function.Tickable; -import de.johni0702.minecraft.gui.function.Typeable; -import de.johni0702.minecraft.gui.layout.CustomLayout; -import de.johni0702.minecraft.gui.layout.VerticalLayout; -import de.johni0702.minecraft.gui.utils.Colors; -import de.johni0702.minecraft.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.gui.screen.Screen; - -import java.util.ArrayList; -import java.util.List; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.function.Supplier; - -import static de.johni0702.minecraft.gui.utils.Utils.DOUBLE_CLICK_INTERVAL; - -//#if MC>=11400 -import de.johni0702.minecraft.gui.versions.MCVer.Keyboard; -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif - -public abstract class AbstractGuiResourceLoadingList - , U extends GuiElement & Comparable> - extends AbstractGuiVerticalList implements Tickable, Loadable, Closeable, Typeable { - private static final String[] LOADING_TEXT = {"Ooo", "oOo", "ooO", "oOo"}; - private final GuiLabel loadingElement = new GuiLabel(); - private final GuiPanel resourcesPanel = new GuiPanel(getListPanel()).setLayout(new VerticalLayout()); - - private final Queue resourcesQueue = new ConcurrentLinkedQueue<>(); - - private Consumer>> onLoad; - private Runnable onSelectionChanged; - private Runnable onSelectionDoubleClicked; - private Thread loaderThread; - private int tick; - - private final List selected = new ArrayList<>(); - private long selectedLastClickTime; - - public AbstractGuiResourceLoadingList() { - } - - public AbstractGuiResourceLoadingList(GuiContainer container) { - super(container); - } - - @Override - public void tick() { - loadingElement.setText(LOADING_TEXT[tick++ / 5 % LOADING_TEXT.length]); - Runnable resource; - while ((resource = resourcesQueue.poll()) != null) { - resource.run(); - } - } - - @Override - public void load() { - // Stop current loading - if (loaderThread != null) { - loaderThread.interrupt(); - try { - loaderThread.join(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return; - } - } - - // Clear list - resourcesQueue.clear(); - for (GuiElement element : new ArrayList<>(resourcesPanel.getChildren())) { - resourcesPanel.removeElement(element); - } - selected.clear(); - onSelectionChanged(); - - // Load new data - loaderThread = new Thread(new Runnable() { - @Override - public void run() { - try { - onLoad.consume(new Consumer>() { - @Override - public void consume(final Supplier obj) { - resourcesQueue.offer(new Runnable() { - @Override - public void run() { - resourcesPanel.addElements(null, new Element(obj.get())); - resourcesPanel.sortElements(); - } - }); - } - }); - } finally { - resourcesQueue.offer(new Runnable() { - @Override - public void run() { - getListPanel().removeElement(loadingElement); - } - }); - } - } - }); - getListPanel().addElements(new VerticalLayout.Data(0.5), loadingElement); - loaderThread.start(); - } - - @Override - public void close() { - loaderThread.interrupt(); - } - - public T onLoad(Consumer>> function) { - this.onLoad = function; - return getThis(); - } - - public void onSelectionChanged() { - if (onSelectionChanged != null) { - onSelectionChanged.run(); - } - } - - public void onSelectionDoubleClicked() { - if (onSelectionDoubleClicked != null) { - onSelectionDoubleClicked.run(); - } - } - - public T onSelectionChanged(Runnable onSelectionChanged) { - this.onSelectionChanged = onSelectionChanged; - return getThis(); - } - - public T onSelectionDoubleClicked(Runnable onSelectionDoubleClicked) { - this.onSelectionDoubleClicked = onSelectionDoubleClicked; - return getThis(); - } - - public List getSelected() { - List selectedResources = new ArrayList<>(selected.size()); - for (Element element : selected) { - selectedResources.add(element.resource); - } - return selectedResources; - } - - @Override - public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { - if (Screen.hasControlDown() && keyCode == Keyboard.KEY_A) { - List all = new ArrayList<>(); - for (GuiElement child : getListPanel().getChildren()) { - if (child instanceof AbstractGuiResourceLoadingList.Element) { - //noinspection unchecked - all.add((Element) child); - } - } - if (selected.size() < all.size()) { - selected.clear(); - selected.addAll(all); - } else { - selected.clear(); - } - onSelectionChanged(); - return true; - } - - return false; - } - - private class Element extends GuiPanel implements Clickable, Comparable { - private final U resource; - - public Element(final U resource) { - this.resource = resource; - addElements(null, resource); - setLayout(new CustomLayout() { - @Override - protected void layout(GuiPanel container, int width, int height) { - pos(resource, 2, 2); - } - - @Override - public ReadableDimension calcMinSize(GuiContainer container) { - ReadableDimension size = resource.getMinSize(); - return new Dimension(size.getWidth() + 4, size.getHeight() + 4); - } - }); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - if (renderInfo.layer == 0 && selected.contains(this)) { - // Draw selection - int w = size.getWidth(); - int h = size.getHeight(); - // Black background - renderer.drawRect(0, 0, w, h, Colors.BLACK); - // Light gray border - renderer.drawRect(0, 0, w, 1, Colors.LIGHT_GRAY); // Top - renderer.drawRect(0, h - 1, w, 1, Colors.LIGHT_GRAY); // Bottom - renderer.drawRect(0, 0, 1, h, Colors.LIGHT_GRAY); // Left - renderer.drawRect(w - 1, 0, 1, h, Colors.LIGHT_GRAY); // Right - } - super.draw(renderer, size, renderInfo); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - Point point = new Point(position); - getContainer().convertFor(this, point); - if (point.getX() > 0 && point.getX() < getLastSize().getWidth() - && point.getY() > 0 && point.getY() < getLastSize().getHeight()) { - if (Screen.hasControlDown()) { - if (selected.contains(this)) { - selected.remove(this); - } else { - selected.add(this); - } - onSelectionChanged(); - } else if (selected.contains(this) && System.currentTimeMillis() - selectedLastClickTime < DOUBLE_CLICK_INTERVAL) { - onSelectionDoubleClicked(); - } else { - selected.clear(); - selected.add(this); - onSelectionChanged(); - } - selectedLastClickTime = System.currentTimeMillis(); - return true; - } - return false; - } - - @Override - public int compareTo(Element o) { - return resource.compareTo(o.resource); - } - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTextArea.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTextArea.java deleted file mode 100644 index 203e9bcd..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTextArea.java +++ /dev/null @@ -1,726 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.AbstractGuiElement; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.function.Focusable; -import de.johni0702.minecraft.gui.function.Tickable; -import de.johni0702.minecraft.gui.function.Typeable; -import de.johni0702.minecraft.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.resource.language.I18n; - -//#if MC>=11400 -import net.minecraft.SharedConstants; -//#else -//$$ import net.minecraft.util.ChatAllowedCharacters; -//$$ import org.lwjgl.input.Keyboard; -//#endif - -import java.util.Arrays; - -import static de.johni0702.minecraft.gui.utils.Utils.clamp; -import static de.johni0702.minecraft.gui.versions.MCVer.*; - -public abstract class AbstractGuiTextArea> - extends AbstractGuiElement implements Clickable, Typeable, Tickable, IGuiTextArea { - private static final ReadableColor BACKGROUND_COLOR = new Color(160, 160, 160); - private static final ReadableColor CURSOR_COLOR = new Color(240, 240, 240); - private static final int BORDER = 4; - private static final int LINE_SPACING = 2; - - private boolean focused; - private Focusable next, previous; - - private Consumer focusChanged; - - // Content - private int maxTextWidth = -1; - private int maxTextHeight = -1; - private int maxCharCount = -1; - - private String[] text = {""}; - private String[] hint; - private int cursorX; - private int cursorY; - private int selectionX; - private int selectionY; - - // Rendering - private int currentXOffset; - private int currentYOffset; - private int blinkCursorTick; - public ReadableColor textColorEnabled = new Color(224, 224, 224); - public ReadableColor textColorDisabled = new Color(112, 112, 112); - private ReadableDimension size = new Dimension(0, 0); // Size of last render - - public AbstractGuiTextArea() { - } - - public AbstractGuiTextArea(GuiContainer container) { - super(container); - } - - @Override - public T setText(String[] lines) { - if (lines.length > maxTextHeight) { - lines = Arrays.copyOf(lines, maxTextHeight); - } - this.text = lines; - for (int i = 0; i < lines.length; i++) { - if (lines[i].length() > maxTextWidth) { - lines[i] = lines[i].substring(0, maxTextWidth); - } - } - return getThis(); - } - - @Override - public String[] getText() { - return this.text; - } - - @Override - public String getText(int fromX, int fromY, int toX, int toY) { - StringBuilder sb = new StringBuilder(); - if (fromY == toY) { - sb.append(text[fromY].substring(fromX, toX)); - } else { - sb.append(text[fromY].substring(fromX)).append('\n'); - for (int y = fromY + 1; y < toY; y++) { - sb.append(text[y]).append('\n'); - } - sb.append(text[toY].substring(0, toX)); - } - return sb.toString(); - } - - private void deleteText(int fromX, int fromY, int toX, int toY) { - String[] newText = new String[text.length - (toY - fromY)]; - if (fromY > 0) { - System.arraycopy(text, 0, newText, 0, fromY); - } - - newText[fromY] = text[fromY].substring(0, fromX) + text[toY].substring(toX); - - if (toY + 1 < text.length) { - System.arraycopy(text, toY + 1, newText, fromY + 1, text.length - toY - 1); - } - text = newText; - } - - @Override - public int getSelectionFromX() { - if (cursorY == selectionY) { - return cursorX > selectionX ? selectionX : cursorX; - } - return cursorY > selectionY ? selectionX : cursorX; - } - - @Override - public int getSelectionToX() { - if (cursorY == selectionY) { - return cursorX > selectionX ? cursorX : selectionX; - } - return cursorY > selectionY ? cursorX : selectionX; - } - - @Override - public int getSelectionFromY() { - return cursorY > selectionY ? selectionY : cursorY; - } - - @Override - public int getSelectionToY() { - return cursorY > selectionY ? cursorY : selectionY; - } - - @Override - public String getSelectedText() { - if (cursorX == selectionX && cursorY == selectionY) { - return ""; - } - int fromX = getSelectionFromX(); - int fromY = getSelectionFromY(); - int toX = getSelectionToX(); - int toY = getSelectionToY(); - return getText(fromX, fromY, toX, toY); - } - - @Override - public void deleteSelectedText() { - if (cursorX == selectionX && cursorY == selectionY) { - return; - } - int fromX = getSelectionFromX(); - int fromY = getSelectionFromY(); - int toX = getSelectionToX(); - int toY = getSelectionToY(); - deleteText(fromX, fromY, toX, toY); - cursorX = selectionX = fromX; - cursorY = selectionY = fromY; - } - - private void updateCurrentOffset() { - currentXOffset = Math.min(currentXOffset, cursorX); - String line = text[cursorY].substring(currentXOffset, cursorX); - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int currentWidth = fontRenderer.getWidth(line); - if (currentWidth > size.getWidth() - BORDER * 2) { - currentXOffset = cursorX - fontRenderer.trimToWidth(line, size.getWidth() - BORDER * 2, true).length(); - } - - currentYOffset = Math.min(currentYOffset, cursorY); - int lineHeight = MCVer.getFontRenderer().fontHeight + LINE_SPACING; - int contentHeight = size.getHeight() - BORDER * 2; - int maxLines = contentHeight / lineHeight; - if (cursorY - currentYOffset >= maxLines) { - currentYOffset = cursorY - maxLines + 1; - } - } - - @Override - public String cutSelectedText() { - String selection = getSelectedText(); - deleteSelectedText(); - return selection; - } - - @Override - public void writeText(String append) { - for (char c : append.toCharArray()) { - writeChar(c); - } - } - - @Override - public void writeChar(char c) { - //#if MC>=11400 - if (!SharedConstants.isValidChar(c)) { - //#else - //$$ if (!ChatAllowedCharacters.isAllowedCharacter(c)) { - //#endif - return; - } - - int totalCharCount = 0; - for(String line : text) { - totalCharCount += line.length(); - } - - if(maxCharCount > 0 && totalCharCount-(getSelectedText().length()) >= maxCharCount) { - return; - } - - deleteSelectedText(); - - if (c == '\n') { - if (text.length >= maxTextHeight) { - return; - } - String[] newText = new String[text.length + 1]; - if (cursorY > 0) { - System.arraycopy(text, 0, newText, 0, cursorY); - } - - newText[cursorY] = text[cursorY].substring(0, cursorX); - newText[cursorY + 1] = text[cursorY].substring(cursorX); - - if (cursorY + 1 < text.length) { - System.arraycopy(text, cursorY + 1, newText, cursorY + 2, text.length - cursorY - 1); - } - text = newText; - selectionX = cursorX = 0; - selectionY = ++cursorY; - } else { - String line = text[cursorY]; - if (line.length() >= maxTextWidth) { - return; - } - - line = line.substring(0, cursorX) + c + line.substring(cursorX); - text[cursorY] = line; - selectionX = ++cursorX; - } - } - - private void deleteNextChar() { - String line = text[cursorY]; - if (cursorX < line.length()) { - line = line.substring(0, cursorX) + line.substring(cursorX + 1); - text[cursorY] = line; - } else if (cursorY + 1 < text.length) { - deleteText(cursorX, cursorY, 0, cursorY + 1); - } - } - - private int getNextWordLength() { - int length = 0; - String line = text[cursorY]; - boolean inWord = true; - for (int i = cursorX; i < line.length(); i++) { - if (inWord) { - if (line.charAt(i) == ' ') { - inWord = false; - } - } else { - if (line.charAt(i) != ' ') { - return length; - } - } - length++; - } - return length; - } - - private void deleteNextWord() { - int worldLength = getNextWordLength(); - if (worldLength == 0) { - deleteNextChar(); - } else { - deleteText(cursorX, cursorY, cursorX + worldLength, cursorY); - } - } - - private void deletePreviousChar() { - if (cursorX > 0) { - String line = text[cursorY]; - line = line.substring(0, cursorX - 1) + line.substring(cursorX); - selectionX = --cursorX; - text[cursorY] = line; - } else if (cursorY > 0) { - int fromX = text[cursorY - 1].length(); - deleteText(fromX, cursorY - 1, cursorX, cursorY); - selectionX = cursorX = fromX; - selectionY = --cursorY; - } - } - - private int getPreviousWordLength() { - int length = 0; - String line = text[cursorY]; - boolean inWord = false; - for (int i = cursorX - 1; i >= 0; i--) { - if (inWord) { - if (line.charAt(i) == ' ') { - return length; - } - } else { - if (line.charAt(i) != ' ') { - inWord = true; - } - } - length++; - } - return length; - } - - private void deletePreviousWord() { - int worldLength = getPreviousWordLength(); - if (worldLength == 0) { - deletePreviousChar(); - } else { - deleteText(cursorX, cursorY, cursorX - worldLength, cursorY); - selectionX = cursorX -= worldLength; - } - } - - @Override - public T setCursorPosition(int x, int y) { - selectionY = cursorY = clamp(y, 0, text.length - 1); - selectionX = cursorX = clamp(x, 0, text[cursorY].length()); - return getThis(); - } - - @Override - protected ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - if (getContainer() != null) { - getContainer().convertFor(this, (Point) (position = new Point(position))); - } - boolean hovering = isMouseHovering(position); - - if (hovering && isFocused() && button == 0) { - updateCurrentOffset(); - int mouseX = position.getX() - BORDER; - int mouseY = position.getY() - BORDER; - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int textY = clamp(mouseY / (fontRenderer.fontHeight + LINE_SPACING) + currentYOffset, 0, text.length - 1); - if (cursorY != textY) { - currentXOffset = 0; - } - String line = text[textY].substring(currentXOffset); - int textX = fontRenderer.trimToWidth(line, mouseX).length() + currentXOffset; - setCursorPosition(textX, textY); - } - - setFocused(hovering); - return hovering; - } - - protected boolean isMouseHovering(ReadablePoint pos) { - return pos.getX() > 0 && pos.getY() > 0 - && pos.getX() < size.getWidth() && pos.getY() < size.getHeight(); - } - - @Override - public T setFocused(boolean isFocused) { - if (isFocused && !this.focused) { - this.blinkCursorTick = 0; // Restart blinking to indicate successful focus - } - if (this.focused != isFocused) { - this.focused = isFocused; - onFocusChanged(this.focused); - } - return getThis(); - } - - @Override - public T setNext(Focusable next) { - this.next = next; - return getThis(); - } - - @Override - public T setPrevious(Focusable previous) { - this.previous = previous; - return getThis(); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - this.size = size; - updateCurrentOffset(); - super.draw(renderer, size, renderInfo); - - TextRenderer fontRenderer = MCVer.getFontRenderer(); - int width = size.getWidth(); - int height = size.getHeight(); - - // Draw black rect once pixel smaller than gray rect - renderer.drawRect(0, 0, width, height, BACKGROUND_COLOR); - renderer.drawRect(1, 1, width - 2, height - 2, ReadableColor.BLACK); - - ReadableColor textColor = isEnabled() ? textColorEnabled : textColorDisabled; - - int lineHeight = fontRenderer.fontHeight + LINE_SPACING; - int contentHeight = height - BORDER * 2; - int maxLines = contentHeight / lineHeight; - int contentWidth = width - BORDER * 2; - - // Draw hint if applicable - if (hint != null && !isFocused() && Arrays.stream(text).allMatch(String::isEmpty)) { - for (int i = 0; i < maxLines && i < hint.length; i++) { - String line = fontRenderer.trimToWidth(hint[i], contentWidth); - - int posY = BORDER + i * lineHeight; - renderer.drawString(BORDER, posY, textColorDisabled, line, true); - } - return; - } - - // Draw lines - for (int i = 0; i < maxLines && i + currentYOffset < text.length; i++) { - int lineY = i + currentYOffset; - String line = text[lineY]; - int leftTrimmed = 0; - if (lineY == cursorY) { - line = line.substring(currentXOffset); - leftTrimmed = currentXOffset; - } - line = fontRenderer.trimToWidth(line, contentWidth); - - // Draw line - int posY = BORDER + i * lineHeight; - int lineEnd = renderer.drawString(BORDER, posY, textColor, line, true); - - // Draw selection - int fromX = getSelectionFromX(); - int fromY = getSelectionFromY(); - int toX = getSelectionToX(); - int toY = getSelectionToY(); - if (lineY > fromY && lineY < toY) { // Whole line selected - renderer.invertColors(lineEnd, posY - 1 + lineHeight, BORDER, posY - 1); - } else if (lineY == fromY && lineY == toY) { // Part of line selected - String leftStr = line.substring(0, clamp(fromX - leftTrimmed, 0, line.length())); - String rightStr = line.substring(clamp(toX - leftTrimmed, 0, line.length())); - int left = BORDER + fontRenderer.getWidth(leftStr); - int right = lineEnd - fontRenderer.getWidth(rightStr) - 1; - renderer.invertColors(right, posY - 1 + lineHeight, left, posY - 1); - } else if (lineY == fromY) { // End of line selected - String rightStr = line.substring(clamp(fromX - leftTrimmed, 0, line.length())); - renderer.invertColors(lineEnd, posY - 1 + lineHeight, lineEnd - fontRenderer.getWidth(rightStr), posY - 1); - } else if (lineY == toY) { // Beginning of line selected - String leftStr = line.substring(0, clamp(toX - leftTrimmed, 0, line.length())); - int right = BORDER + fontRenderer.getWidth(leftStr); - renderer.invertColors(right, posY - 1 + lineHeight, BORDER, posY - 1); - } - - // Draw cursor - if (lineY == cursorY && blinkCursorTick / 6 % 2 == 0 && focused) { - String beforeCursor = line.substring(0, cursorX - leftTrimmed); - int posX = BORDER + fontRenderer.getWidth(beforeCursor); - if (cursorX == text[lineY].length()) { - renderer.drawString(posX, posY, CURSOR_COLOR, "_", true); - } else { - renderer.drawRect(posX, posY - 1, 1, 1 + fontRenderer.fontHeight, CURSOR_COLOR); - } - } - } - } - - @Override - public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { - if (keyCode == Keyboard.KEY_TAB) { - Focusable other = shiftDown ? previous : next; - if (other != null) { - setFocused(false); - other.setFocused(true); - } - return true; - } - - if (!this.focused) { - return false; - } - - if (Screen.hasControlDown()) { - switch (keyCode) { - case Keyboard.KEY_A: // Select all - cursorX = cursorY = 0; - selectionY = text.length - 1; - selectionX = text[selectionY].length(); - return true; - case Keyboard.KEY_C: // Copy - MCVer.setClipboardString(getSelectedText()); - return true; - case Keyboard.KEY_V: // Paste - if (isEnabled()) { - writeText(MCVer.getClipboardString()); - } - return true; - case Keyboard.KEY_X: // Cut - if (isEnabled()) { - MCVer.setClipboardString(cutSelectedText()); - } - return true; - } - } - - boolean words = Screen.hasControlDown(); - boolean select = Screen.hasShiftDown(); - switch (keyCode) { - case Keyboard.KEY_HOME: - cursorX = 0; - break; - case Keyboard.KEY_END: - cursorX = text[cursorY].length(); - break; - case Keyboard.KEY_LEFT: - if (cursorX == 0) { - if (cursorY > 0) { - cursorY--; - cursorX = text[cursorY].length(); - } - } else { - if (words) { - cursorX -= getPreviousWordLength(); - } else { - cursorX--; - } - } - break; - case Keyboard.KEY_RIGHT: - if (cursorX == text[cursorY].length()) { - if (cursorY < text.length - 1) { - cursorY++; - cursorX = 0; - } - } else { - if (words) { - cursorX += getNextWordLength(); - } else { - cursorX++; - } - } - break; - case Keyboard.KEY_UP: - if (cursorY > 0) { - cursorY--; - cursorX = Math.min(cursorX, text[cursorY].length()); - } - break; - case Keyboard.KEY_DOWN: - if (cursorY + 1 < text.length) { - cursorY++; - cursorX = Math.min(cursorX, text[cursorY].length()); - } - break; - case Keyboard.KEY_BACK: - if (isEnabled()) { - if (getSelectedText().length() > 0) { - deleteSelectedText(); - } else if (words) { - deletePreviousWord(); - } else { - deletePreviousChar(); - } - } - return true; - case Keyboard.KEY_DELETE: - if (isEnabled()) { - if (getSelectedText().length() > 0) { - deleteSelectedText(); - } else if (words) { - deleteNextWord(); - } else { - deleteNextChar(); - } - } - return true; - default: - if (isEnabled()) { - if (keyChar == '\r') { - keyChar = '\n'; - } - writeChar(keyChar); - } - return true; - } - - if (!select) { - selectionX = cursorX; - selectionY = cursorY; - } - return true; - } - - @Override - public void tick() { - blinkCursorTick++; - } - - @Override - public T setMaxTextWidth(int maxTextWidth) { - this.maxTextWidth = maxTextWidth; - return getThis(); - } - - @Override - public T setMaxTextHeight(int maxTextHeight) { - this.maxTextHeight = maxTextHeight; - return getThis(); - } - - @Override - public T setMaxCharCount(int maxCharCount) { - this.maxCharCount = maxCharCount; - return getThis(); - } - - @Override - public T setTextColor(ReadableColor textColor) { - this.textColorEnabled = textColor; - return getThis(); - } - - @Override - public T setTextColorDisabled(ReadableColor textColorDisabled) { - this.textColorDisabled = textColorDisabled; - return getThis(); - } - - @Override - public T onFocusChange(Consumer focusChanged) { - this.focusChanged = focusChanged; - return getThis(); - } - - /** - * Called when the element has been focused or unfocused - */ - protected void onFocusChanged(boolean focused) { - if (focusChanged != null) { - focusChanged.consume(focused); - } - } - - @Override - public String[] getHint() { - return hint; - } - - @Override - public T setHint(String... hint) { - this.hint = hint; - return getThis(); - } - - @Override - public T setI18nHint(String hint, Object... args) { - setHint(I18n.translate(hint, args).split("/n")); - return getThis(); - } - - public boolean isFocused() { - return this.focused; - } - - public Focusable getNext() { - return this.next; - } - - public Focusable getPrevious() { - return this.previous; - } - - public int getMaxTextWidth() { - return this.maxTextWidth; - } - - public int getMaxTextHeight() { - return this.maxTextHeight; - } - - public int getMaxCharCount() { - return this.maxCharCount; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTimeline.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTimeline.java deleted file mode 100644 index ed7d2f65..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTimeline.java +++ /dev/null @@ -1,350 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.AbstractGuiElement; -import de.johni0702.minecraft.gui.element.GuiTooltip; -import de.johni0702.minecraft.gui.function.Clickable; -import de.johni0702.minecraft.gui.utils.Colors; -import de.johni0702.minecraft.gui.utils.Utils; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -import static de.johni0702.minecraft.gui.utils.Utils.clamp; - -public abstract class AbstractGuiTimeline> extends AbstractGuiElement implements IGuiTimeline, Clickable { - protected static final int TEXTURE_WIDTH = 64; - protected static final int TEXTURE_HEIGHT = 22; - - protected static final int TEXTURE_X = 0; - protected static final int TEXTURE_Y = 16; - - protected static final int BORDER_LEFT = 4; - protected static final int BORDER_RIGHT = 4; - protected static final int BORDER_TOP = 4; - protected static final int BORDER_BOTTOM = 3; - - protected static final int MARKER_MIN_DISTANCE = 40; - - private OnClick onClick; - - private int length; - private int cursorPosition; - private double zoom = 1; - private int offset; - private boolean drawCursor = true; - private boolean drawMarkers; - - /** - * Use {@link #getLastSize()} instead. - */ - @Deprecated - protected ReadableDimension size; - - public AbstractGuiTimeline() { - } - - public AbstractGuiTimeline(GuiContainer container) { - super(container); - } - - { - setTooltip(new GuiTooltip(){ - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - setText(getTooltipText(renderInfo)); - super.draw(renderer, size, renderInfo); - } - }.setText("00:00")); - } - - protected String getTooltipText(RenderInfo renderInfo) { - int ms = getTimeAt(renderInfo.mouseX, renderInfo.mouseY); - int s = ms / 1000 % 60; - int m = ms / 1000 / 60; - return String.format("%02d:%02d", m, s); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - this.size = size; - super.draw(renderer, size, renderInfo); - - int width = size.getWidth(); - int height = size.getHeight(); - - renderer.bindTexture(TEXTURE); - - // We have to increase the border size as there is one pixel row which is part of the border while drawing - // but isn't during position calculations due to shadows - Utils.drawDynamicRect(renderer, width, height, TEXTURE_X, TEXTURE_Y, TEXTURE_WIDTH, TEXTURE_HEIGHT, - BORDER_TOP + 1, BORDER_BOTTOM, BORDER_LEFT + 1, BORDER_RIGHT); - - if (drawMarkers) { - drawMarkers(renderer, size); - } - - drawTimelineCursor(renderer, size); - } - - /** - * Draws the timeline cursor. - * This is separate from the main draw method so subclasses can repaint the cursor - * in case it got drawn over by other elements. - * @param renderer Gui renderer used to draw the cursor - * @param size Size of the drawable area - */ - protected void drawTimelineCursor(GuiRenderer renderer, ReadableDimension size) { - if (!drawCursor) return; - int height = size.getHeight(); - renderer.bindTexture(TEXTURE); - - int visibleLength = (int) (length * zoom); - int cursor = clamp(cursorPosition, offset, offset + visibleLength); - double positionInVisible = cursor - offset; - double fractionOfVisible = positionInVisible / visibleLength; - int cursorX = (int) (BORDER_LEFT + fractionOfVisible * (size.getWidth() - BORDER_LEFT - BORDER_RIGHT)); - - // Pin - renderer.drawTexturedRect(cursorX - 2, BORDER_TOP - 1, 64, 0, 5, 4); - // Needle - for (int y = BORDER_TOP - 1; y < height - BORDER_BOTTOM; y += 11) { - int segmentHeight = Math.min(11, height - BORDER_BOTTOM - y); - renderer.drawTexturedRect(cursorX - 2, y, 64, 4, 5, segmentHeight); - } - } - - protected void drawMarkers(GuiRenderer renderer, ReadableDimension size) { - int visibleLength = (int) (length * zoom); - int markerInterval = getMarkerInterval(); - int smallInterval = Math.max(markerInterval / 5, 1); - int time = offset / markerInterval * markerInterval; - while (time <= offset + visibleLength) { - if (time >= offset) { - drawMarker(renderer, size, time, time % markerInterval == 0); - } - time += smallInterval; - } - } - - protected void drawMarker(GuiRenderer renderer, ReadableDimension size, int time, boolean big) { - int visibleLength = (int) (length * zoom); - double positionInVisible = time - offset; - double fractionOfVisible = positionInVisible / visibleLength; - int positionX = (int) (BORDER_LEFT + fractionOfVisible * (size.getWidth() - BORDER_LEFT - BORDER_RIGHT)); - int height = size.getHeight() / (big ? 3 : 6); - ReadableColor color = big ? Colors.LIGHT_GRAY : Colors.WHITE; - renderer.drawRect(positionX, size.getHeight() - BORDER_BOTTOM - height, 1, height, color); - } - - /** - * Returns the time which the mouse is at. - * @param mouseX X coordinate of the mouse - * @param mouseY Y coordinate of the mouse - * @return The time or -1 if the mouse isn't on the timeline - */ - protected int getTimeAt(int mouseX, int mouseY) { - if (getLastSize() == null) { - return -1; - } - Point mouse = new Point(mouseX, mouseY); - getContainer().convertFor(this, mouse); - mouseX = mouse.getX(); - mouseY = mouse.getY(); - - if (mouseX < 0 || mouseY < 0 - || mouseX > size.getWidth() || mouseY > size.getHeight()) { - return -1; - } - - int width = size.getWidth(); - int bodyWidth = width - BORDER_LEFT - BORDER_RIGHT; - double segmentLength = length * zoom; - double segmentTime = segmentLength * (mouseX - BORDER_LEFT) / bodyWidth; - return Math.min(Math.max((int) Math.round(offset + segmentTime), 0), length); - } - - public void onClick(int time) { - if (onClick != null) { - onClick.run(time); - } - } - - @Override - public ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - @Override - public T setLength(int length) { - this.length = length; - return getThis(); - } - - @Override - public int getLength() { - return length; - } - - @Override - public T setCursorPosition(int position) { - this.cursorPosition = Math.min(Math.max(position, 0), length); - return getThis(); - } - - @Override - public int getCursorPosition() { - return cursorPosition; - } - - public T ensureCursorVisible() { - return ensureCursorVisible(0); - } - - public T ensureCursorVisibleWithPadding() { - return ensureCursorVisible(Math.max((int) (length * zoom) / 10, 10)); - } - - public T ensureCursorVisible(int padding) { - int visibleLength = (int) (length * zoom); - if (cursorPosition - padding < offset) { - setOffset(cursorPosition - padding); - } else if (cursorPosition + padding > offset + visibleLength) { - setOffset(cursorPosition + padding - visibleLength); - } - return getThis(); - } - - @Override - public T setZoom(double zoom) { - this.zoom = Math.min(zoom, 1); - checkOffset(); - return getThis(); - } - - @Override - public double getZoom() { - return zoom; - } - - @Override - public T setOffset(int offset) { - this.offset = Math.max(offset, 0); - checkOffset(); - return getThis(); - } - - @Override - public int getOffset() { - return offset; - } - - @Override - public T onClick(OnClick onClick) { - this.onClick = onClick; - return getThis(); - } - - @Override - public boolean mouseClick(ReadablePoint position, int button) { - int time = getTimeAt(position.getX(), position.getY()); - if (time != -1) { - onClick(time); - return true; - } - return false; - } - - @Override - public boolean getMarkers() { - return drawMarkers; - } - - @Override - public T setMarkers(boolean active) { - this.drawMarkers = active; - return getThis(); - } - - @Override - public T setMarkers() { - return setMarkers(true); - } - - @Override - public int getMarkerInterval() { - if (size == null) { - return length; - } - int width = size.getWidth() - BORDER_LEFT - BORDER_RIGHT; // Width of the drawn timeline - double segmentLength = length * zoom; // Length of the drawn timeline - int markerMinDistance = (int) (MARKER_MIN_DISTANCE * (length > 60 * 60 * 1000 ? 1.2 : 1)); - int maxMarkers = width / markerMinDistance; // Max. amount of markers that can fit in the timeline - int minInterval = (int) (segmentLength / maxMarkers); // Min. interval between those markers - final int S = 1000; - final int M = 60*S; - final int H = 60*M; - final int[] snapTo = {S, 2*S, 5*S, 10*S, 15*S, 20*S, 30*S, M, 2*M, 5*M, 10*M, 15*M, 30*M, H, 2*H, 5*H, 10*H}; - // Find next greater snap - for (int snap : snapTo) { - if (snap > minInterval) { - return snap; - } - } - return snapTo[snapTo.length - 1]; - } - - @Override - public T setCursor(boolean active) { - this.drawCursor = active; - return getThis(); - } - - @Override - public boolean getCursor() { - return drawCursor; - } - - /** - * Make sure the offset is far enough to the left so we don't look over the edge on the right. - */ - private void checkOffset() { - int visibleLength = (int) (length * zoom); - if (visibleLength + offset > length) { - offset = length - visibleLength; - } - } - - @Override - protected ReadableDimension getLastSize() { - return super.getLastSize(); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTimelineTime.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTimelineTime.java deleted file mode 100644 index 9b5d62a1..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/AbstractGuiTimelineTime.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.AbstractGuiElement; -import de.johni0702.minecraft.gui.utils.Colors; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.versions.MCVer; - -import static de.johni0702.minecraft.gui.element.advanced.AbstractGuiTimeline.BORDER_LEFT; -import static de.johni0702.minecraft.gui.element.advanced.AbstractGuiTimeline.BORDER_RIGHT; - -public abstract class AbstractGuiTimelineTime, U extends AbstractGuiTimeline> - extends AbstractGuiElement implements IGuiTimelineTime { - private U timeline; - - public AbstractGuiTimelineTime() { - } - - public AbstractGuiTimelineTime(GuiContainer container) { - super(container); - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - - if (timeline == null || timeline.getLastSize() == null) return; - - int offset = (size.getWidth() - timeline.getLastSize().getWidth()) / 2; - int visibleLength = (int) (timeline.getLength() * timeline.getZoom()); - int markerInterval = timeline.getMarkerInterval(); - int time = timeline.getOffset() / markerInterval * markerInterval; - while (time <= timeline.getOffset() + visibleLength) { - if (time >= timeline.getOffset()) { - drawTime(renderer, size, time, offset); - } - time += markerInterval; - } - } - - protected void drawTime(GuiRenderer renderer, ReadableDimension size, int time, int offset) { - int visibleLength = (int) (timeline.getLength() * timeline.getZoom()); - double positionInVisible = time - timeline.getOffset(); - double fractionOfVisible = positionInVisible / visibleLength; - int positionX = (int) (BORDER_LEFT + fractionOfVisible * (size.getWidth() - BORDER_LEFT - BORDER_RIGHT)) + offset; - String str; - if (timeline.getLength() > 60 * 60 * 1000) { - str = String.format("%02d:%02d:%02d", time / 1000 / 60 / 60, time / 1000 / 60 % 60, time / 1000 % 60); - } else { - str = String.format("%02d:%02d", time / 1000 / 60, time / 1000 % 60); - } - int stringWidth = MCVer.getFontRenderer().getWidth(str); - positionX = Math.max(stringWidth / 2, Math.min(size.getWidth() - stringWidth / 2, positionX)); - renderer.drawCenteredString(positionX, 0, Colors.WHITE, str, true); - } - - @Override - public ReadableDimension calcMinSize() { - return new Dimension(0, 0); - } - - @Override - public T setTimeline(U timeline) { - this.timeline = timeline; - return getThis(); - } - - @Override - public U getTimeline() { - return timeline; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiColorPicker.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiColorPicker.java deleted file mode 100644 index 4939ff47..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiColorPicker.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiColorPicker extends AbstractGuiColorPicker { - - public GuiColorPicker() { - } - - public GuiColorPicker(GuiContainer container) { - super(container); - } - - @Override - protected GuiColorPicker getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiDropdownMenu.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiDropdownMenu.java deleted file mode 100644 index 72eb3261..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiDropdownMenu.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiDropdownMenu extends AbstractGuiDropdownMenu> { - - public GuiDropdownMenu() { - } - - public GuiDropdownMenu(GuiContainer container) { - super(container); - } - - @Override - protected GuiDropdownMenu getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiProgressBar.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiProgressBar.java deleted file mode 100644 index 9cda0fa9..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiProgressBar.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiProgressBar extends AbstractGuiProgressBar { - public GuiProgressBar() { - } - - public GuiProgressBar(GuiContainer container) { - super(container); - } - - @Override - protected GuiProgressBar getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiResourceLoadingList.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiResourceLoadingList.java deleted file mode 100644 index 6127db04..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiResourceLoadingList.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.GuiElement; - -public class GuiResourceLoadingList & Comparable> - extends AbstractGuiResourceLoadingList, U> { - public GuiResourceLoadingList() { - } - - public GuiResourceLoadingList(GuiContainer container) { - super(container); - } - - @Override - protected GuiResourceLoadingList getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTextArea.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTextArea.java deleted file mode 100644 index 0903c8c8..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTextArea.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiTextArea extends AbstractGuiTextArea { - public GuiTextArea() { - } - - public GuiTextArea(GuiContainer container) { - super(container); - } - - @Override - protected GuiTextArea getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTimeline.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTimeline.java deleted file mode 100644 index b6040831..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTimeline.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiTimeline extends AbstractGuiTimeline { - public GuiTimeline() { - } - - public GuiTimeline(GuiContainer container) { - super(container); - } - - @Override - protected GuiTimeline getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTimelineTime.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTimelineTime.java deleted file mode 100644 index 9d1c5171..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/GuiTimelineTime.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.container.GuiContainer; - -public class GuiTimelineTime> extends AbstractGuiTimelineTime, U> { - public GuiTimelineTime() { - } - - public GuiTimelineTime(GuiContainer container) { - super(container); - } - - @Override - protected GuiTimelineTime getThis() { - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiColorPicker.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiColorPicker.java deleted file mode 100644 index 7ed9640e..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiColorPicker.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; - -public interface IGuiColorPicker> extends GuiElement { - T setColor(ReadableColor color); - - ReadableColor getColor(); - - T setOpened(boolean opened); - - boolean isOpened(); - - T onSelection(Consumer consumer); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiDropdownMenu.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiDropdownMenu.java deleted file mode 100644 index b76c8b90..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiDropdownMenu.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.element.IGuiClickable; -import de.johni0702.minecraft.gui.utils.Consumer; - -import java.util.Map; -import java.util.function.Function; - -public interface IGuiDropdownMenu> extends GuiElement { - T setValues(V... values); - - T setSelected(int selected); - - T setSelected(V value); - - V getSelectedValue(); - - T setOpened(boolean opened); - - int getSelected(); - - V[] getValues(); - - boolean isOpened(); - - T onSelection(Consumer consumer); - - /** - * Returns an unmodifiable map of values with their GUI elements. - * The GUI elements may be modified.
- * The returned map is only valid until {@link #setValues(Object[])} is - * called, at which point new GUI elements are created.
- * This may return null if {@link #setValues(Object[])} has not yet been called. - * @return Unmodifiable, ordered map of entries - */ - Map getDropdownEntries(); - - /** - * Set the function used to convert the values to display strings. - * If not set, {@code Object::toString} is used. - * @param toString Function used to convert - * @return {@code this}, for chaining - */ - T setToString(Function toString); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiProgressBar.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiProgressBar.java deleted file mode 100644 index 9f940e66..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiProgressBar.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.element.GuiElement; - -public interface IGuiProgressBar> extends GuiElement { - T setProgress(float progress); - - T setLabel(String label); - - T setI18nLabel(String label, Object... args); - - float getProgress(); - - String getLabel(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTextArea.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTextArea.java deleted file mode 100644 index 32ccfc12..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTextArea.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.function.Focusable; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; - -public interface IGuiTextArea> extends GuiElement, Focusable { - T setText(String[] lines); - - String[] getText(); - - String getText(int fromX, int fromY, int toX, int toY); - - int getSelectionFromX(); - - int getSelectionToX(); - - int getSelectionFromY(); - - int getSelectionToY(); - - String getSelectedText(); - - void deleteSelectedText(); - - String cutSelectedText(); - - void writeText(String append); - - void writeChar(char c); - - T setCursorPosition(int x, int y); - - T setMaxTextWidth(int maxTextWidth); - - T setMaxTextHeight(int maxTextHeight); - - T setMaxCharCount(int maxCharCount); - - T setTextColor(ReadableColor textColor); - - T setTextColorDisabled(ReadableColor textColorDisabled); - - int getMaxTextWidth(); - - int getMaxTextHeight(); - - int getMaxCharCount(); - - String[] getHint(); - T setHint(String... hint); - T setI18nHint(String hint, Object... args); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTimeline.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTimeline.java deleted file mode 100644 index e4508b1b..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTimeline.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.element.GuiElement; - -public interface IGuiTimeline> extends GuiElement { - - /** - * Set the total length of the timeline. - * @param length length in milliseconds, must be > 0 - * @return {@code this}, for chaining - */ - T setLength(int length); - - /** - * Returns the total length of the timeline. - * @return The total length in millisconds - */ - int getLength(); - - /** - * Set the current position of the cursor. Should be between 0 and {@link #getLength()}. - * @param position Position of the cursor in milliseconds - * @return {@code this}, for chaining - */ - T setCursorPosition(int position); - - /** - * Returns the current position of the cursor. Should be between 0 and {@link #getLength()}. - * @return cursor position in milliseconds - */ - int getCursorPosition(); - - /** - * Set the zoom of this timeline. 1/10 allows the user to see 1/10 of the total length. - * @param zoom The zoom factor. Must be between 1 (inclusive) and 0 (exclusive) - * @return {@code this}, for chaining - */ - T setZoom(double zoom); - - /** - * Returns the zoom of this timeline. 1/10 allows the user to see 1/10 of the total length. - * @return The zoom factor. Must be between 1 (inclusive) and 0 (exclusive) - */ - double getZoom(); - - /** - * Set the position of the timeline which should be shown. - * The left side of the timeline will start at this offset. - * @param offset The offset in milliseconds - * @return {@code this}, for chaining - */ - T setOffset(int offset); - - /** - * Returns the position of the timeline which should be shown. - * The left side of the timeline will start at this offset. - * @return The offset in milliseconds - */ - int getOffset(); - - /** - * Enables makers for this timeline. - * Markers are drawn in regular intervals and between each big marker there are three small ones. - * @return {@code this}, for chaining - */ - T setMarkers(); - - /** - * Set whether markers should be drawn on this timeline. - * Markers are drawn in regular intervals and between each big marker there are three small ones. - * @param active {@code true} to enable drawing of markers, {@code false} to disable it - * @return {@code this}, for chaining - */ - T setMarkers(boolean active); - - /** - * Returns whether markers are drawn on this timeline. - * Markers are drawn in regular intervals and between each big marker there are three small ones. - * @return {@code true} if markers are drawn, {@code false} otherwise - */ - boolean getMarkers(); - - /** - * Returns the interval at which big markers are draw on the timeline. - * There are three small markers between each pair of big markers. - * @return Interval in milliseconds - */ - int getMarkerInterval(); - - /** - * Set whether the cursor should be drawn on this timeline. - * @param active {@code true} to enable drawing of the cursor, {@code false} otherwise - * @return {@code this}, for chaining - */ - T setCursor(boolean active); - - /** - * Returns whether the cursor is drawn on this timeline. - * @return {@code true} if the cursor is drawn, {@code false} otherwise - */ - boolean getCursor(); - - T onClick(OnClick onClick); - - interface OnClick { - void run(int time); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTimelineTime.java b/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTimelineTime.java deleted file mode 100644 index a536190e..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/element/advanced/IGuiTimelineTime.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.element.advanced; - -import de.johni0702.minecraft.gui.element.GuiElement; - -/** - * Displays the time of a timeline at its big markers. - * This should be used with a GuiTimeline in a VerticalLayout, both centered at 0.5. - * - * @param Type of this timeline time instance, used for chaining - * @param Type of the timeline - */ -public interface IGuiTimelineTime, U extends IGuiTimeline> extends GuiElement { - /** - * Returns the timeline of which the time is drawn. - * @return The timeline or {@code null} if not yet set - */ - U getTimeline(); - - /** - * Set the timeline of which the time should be drawn. - * @param timeline The timeline - * @return {@code this}, for chaining - */ - T setTimeline(U timeline); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Clickable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/function/Clickable.java deleted file mode 100644 index 3064230c..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Clickable.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.function; - -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -public interface Clickable { - boolean mouseClick(ReadablePoint position, int button); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Closeable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/function/Closeable.java deleted file mode 100644 index 0079989c..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Closeable.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.function; - -public interface Closeable { - void close(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Draggable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/function/Draggable.java deleted file mode 100644 index 4e594d82..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Draggable.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.function; - -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -public interface Draggable extends Clickable { - boolean mouseDrag(ReadablePoint position, int button, @Deprecated long timeSinceLastCall); - boolean mouseRelease(ReadablePoint position, int button); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Focusable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/function/Focusable.java deleted file mode 100644 index 2d782df1..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Focusable.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.function; - -import de.johni0702.minecraft.gui.utils.Consumer; - -public interface Focusable> { - - boolean isFocused(); - T setFocused(boolean focused); - - T onFocusChange(Consumer consumer); - - Focusable getNext(); - T setNext(Focusable next); - - Focusable getPrevious(); - T setPrevious(Focusable previous); - -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Loadable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/function/Loadable.java deleted file mode 100644 index b8f422fb..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Loadable.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.function; - -public interface Loadable { - void load(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Scrollable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/function/Scrollable.java deleted file mode 100644 index e40d92a0..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Scrollable.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.function; - -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -public interface Scrollable { - /** - * Called when the user scrolled. - * @param mousePosition Global position of the mouse. - * @param dWheel Wheel movement (positive is upwards, negative is downwards) - * @return {@code true} if this event should be consumed, - * {@code false} if it should be delivered to other elements as well - */ - boolean scroll(ReadablePoint mousePosition, int dWheel); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Tickable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/function/Tickable.java deleted file mode 100644 index 51691f64..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Tickable.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.function; - -public interface Tickable { - void tick(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Typeable.java b/jGui/src/main/java/de/johni0702/minecraft/gui/function/Typeable.java deleted file mode 100644 index 6ba17fe6..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/function/Typeable.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.function; - -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -public interface Typeable { - boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/CustomLayout.java b/jGui/src/main/java/de/johni0702/minecraft/gui/layout/CustomLayout.java deleted file mode 100644 index df3237b0..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/CustomLayout.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.layout; - -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; - -public abstract class CustomLayout> implements Layout { - private final Layout parent; - private final Map> result = new LinkedHashMap<>(); - - public CustomLayout() { - this(null); - } - - public CustomLayout(Layout parent) { - this.parent = parent; - } - - @Override - @SuppressWarnings("unchecked") - public Map> layOut(GuiContainer container, ReadableDimension size) { - result.clear(); - if (parent == null) { - Collection elements = container.getChildren(); - for (GuiElement element : elements) { - result.put(element, Pair.of(new Point(0, 0), new Dimension(element.getMinSize()))); - } - } else { - Map> elements = parent.layOut(container, size); - for (Map.Entry> entry : elements.entrySet()) { - Pair pair = entry.getValue(); - result.put(entry.getKey(), Pair.of(new Point(pair.getLeft()), new Dimension(pair.getRight()))); - } - } - - layout((T) container, size.getWidth(), size.getHeight()); - - return (Map) result; - } - - private Pair entry(GuiElement element) { - return result.get(element); - } - - protected void set(GuiElement element, int x, int y, int width, int height) { - Pair entry = entry(element); - entry.getLeft().setLocation(x, y); - entry.getRight().setSize(width, height); - } - - protected void pos(GuiElement element, int x, int y) { - entry(element).getLeft().setLocation(x, y); - } - - protected void size(GuiElement element, ReadableDimension size) { - size.getSize(entry(element).getRight()); - } - - protected void size(GuiElement element, int width, int height) { - entry(element).getRight().setSize(width, height); - } - - protected void x(GuiElement element, int x) { - entry(element).getLeft().setX(x); - } - - protected void y(GuiElement element, int y) { - entry(element).getLeft().setY(y); - } - - protected void width(GuiElement element, int width) { - entry(element).getRight().setWidth(width); - } - - protected void height(GuiElement element, int height) { - entry(element).getRight().setHeight(height); - } - - protected int x(GuiElement element) { - return entry(element).getLeft().getX(); - } - - protected int y(GuiElement element) { - return entry(element).getLeft().getY(); - } - - protected int width(GuiElement element) { - return entry(element).getRight().getWidth(); - } - - protected int height(GuiElement element) { - return entry(element).getRight().getHeight(); - } - - protected abstract void layout(T container, int width, int height); - - @Override - public ReadableDimension calcMinSize(GuiContainer container) { - return new Dimension(0, 0); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/GridLayout.java b/jGui/src/main/java/de/johni0702/minecraft/gui/layout/GridLayout.java deleted file mode 100644 index 24db00c7..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/GridLayout.java +++ /dev/null @@ -1,276 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.layout; - -import com.google.common.base.Preconditions; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Objects; - -public class GridLayout implements Layout { - private static final Data DEFAULT_DATA = new Data(); - - private int columns; - - private int spacingX, spacingY; - - private boolean cellsEqualSize = true; - - @Override - public Map> layOut(GuiContainer container, ReadableDimension size) { - Preconditions.checkState(columns != 0, "Columns may not be 0."); - int elements = container.getElements().size(); - int rows = (elements - 1 + columns) / columns; - if (rows < 1) { - return Collections.emptyMap(); - } - int cellWidth = (size.getWidth() + spacingX) / columns - spacingX; - int cellHeight = (size.getHeight() + spacingY) / rows - spacingY; - - Pair maxCellSize = null; - - if(!cellsEqualSize) { - maxCellSize = calcNeededCellSize(container); - } - - Map> map = new LinkedHashMap<>(); - Iterator> iter = container.getElements().entrySet().iterator(); - for (int i = 0; i < rows; i++) { - for (int j = 0; j < columns; j++) { - if (!iter.hasNext()) { - return map; - } - int x = j * (cellWidth + spacingX); - int y = i * (cellHeight + spacingY); - - if (maxCellSize != null) { - cellWidth = maxCellSize.getLeft()[j]; - cellHeight = maxCellSize.getRight()[i]; - - x = 0; - for (int x1 = 0; x1 < j; x1++) { - x += maxCellSize.getLeft()[x1]; - x += spacingX; - } - - y = 0; - for (int y1 = 0; y1 < i; y1++) { - y += maxCellSize.getRight()[y1]; - y += spacingY; - } - } - - Map.Entry entry = iter.next(); - GuiElement element = entry.getKey(); - Data data = entry.getValue() instanceof Data ? (Data) entry.getValue() : DEFAULT_DATA; - Dimension elementSize = new Dimension(element.getMinSize()); - ReadableDimension elementMaxSize = element.getMaxSize(); - elementSize.setWidth(Math.min(cellWidth, elementMaxSize.getWidth())); - elementSize.setHeight(Math.min(cellHeight, elementMaxSize.getHeight())); - - int remainingWidth = cellWidth - elementSize.getWidth(); - int remainingHeight = cellHeight - elementSize.getHeight(); - x += (int) (data.alignmentX * remainingWidth); - y += (int) (data.alignmentY * remainingHeight); - map.put(element, Pair.of(new Point(x, y), elementSize)); - } - } - return map; - } - - @Override - public ReadableDimension calcMinSize(GuiContainer container) { - Preconditions.checkState(columns != 0, "Columns may not be 0."); - int maxWidth = 0, maxHeight = 0; - - int elements = 0; - for (Map.Entry entry : container.getElements().entrySet()) { - GuiElement element = entry.getKey(); - ReadableDimension minSize = element.getMinSize(); - - int width = minSize.getWidth(); - if (width > maxWidth) { - maxWidth = width; - } - - int height = minSize.getHeight(); - if (height > maxHeight) { - maxHeight = height; - } - elements++; - } - int rows = (elements - 1 + columns) / columns; - - int totalWidth = maxWidth * columns; - int totalHeight = maxHeight * rows; - - if (!cellsEqualSize) { - Pair maxCellSize = calcNeededCellSize(container); - - totalWidth = 0; - for (int w : maxCellSize.getLeft()) { - totalWidth += w; - } - - totalHeight = 0; - for (int h : maxCellSize.getRight()) { - totalHeight += h; - } - } - - if (elements > 0) { - totalWidth+=spacingX * (columns - 1); - } - if (elements > columns) { - totalHeight+=spacingY * (rows - 1); - } - return new Dimension(totalWidth, totalHeight); - } - - private Pair calcNeededCellSize(GuiContainer container) { - int[] columnMaxWidth = new int[columns]; - int[] rowMaxHeight = new int[(container.getElements().size() - 1 + columns) / columns]; - - int elements = 0; - for (Map.Entry entry : container.getElements().entrySet()) { - int column = elements % columns; - int row = elements / columns; - - GuiElement element = entry.getKey(); - ReadableDimension minSize = element.getMinSize(); - - int width = minSize.getWidth(); - if (width > columnMaxWidth[column]) { - columnMaxWidth[column] = width; - } - - int height = minSize.getHeight(); - if (height > rowMaxHeight[row]) { - rowMaxHeight[row] = height; - } - - elements++; - } - - return Pair.of(columnMaxWidth, rowMaxHeight); - } - - public int getColumns() { - return this.columns; - } - - public int getSpacingX() { - return this.spacingX; - } - - public int getSpacingY() { - return this.spacingY; - } - - public boolean isCellsEqualSize() { - return this.cellsEqualSize; - } - - public GridLayout setColumns(int columns) { - this.columns = columns; - return this; - } - - public GridLayout setSpacingX(int spacingX) { - this.spacingX = spacingX; - return this; - } - - public GridLayout setSpacingY(int spacingY) { - this.spacingY = spacingY; - return this; - } - - public GridLayout setCellsEqualSize(boolean cellsEqualSize) { - this.cellsEqualSize = cellsEqualSize; - return this; - } - - public static class Data implements LayoutData { - private double alignmentX, alignmentY; - - public Data() { - this(0, 0); - } - - public Data(double alignmentX, double alignmentY) { - this.alignmentX = alignmentX; - this.alignmentY = alignmentY; - } - - public double getAlignmentX() { - return this.alignmentX; - } - - public double getAlignmentY() { - return this.alignmentY; - } - - public void setAlignmentX(double alignmentX) { - this.alignmentX = alignmentX; - } - - public void setAlignmentY(double alignmentY) { - this.alignmentY = alignmentY; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Data data = (Data) o; - return Double.compare(data.alignmentX, alignmentX) == 0 && - Double.compare(data.alignmentY, alignmentY) == 0; - } - - @Override - public int hashCode() { - return Objects.hash(alignmentX, alignmentY); - } - - @Override - public String toString() { - return "Data{" + - "alignmentX=" + alignmentX + - ", alignmentY=" + alignmentY + - '}'; - } - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/HorizontalLayout.java b/jGui/src/main/java/de/johni0702/minecraft/gui/layout/HorizontalLayout.java deleted file mode 100644 index fec06f2c..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/HorizontalLayout.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.layout; - -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Objects; - -public class HorizontalLayout implements Layout { - private static final Data DEFAULT_DATA = new Data(0); - - private final Alignment alignment; - - private int spacing; - - public HorizontalLayout() { - this(Alignment.LEFT); - } - - public HorizontalLayout(Alignment alignment) { - this.alignment = alignment; - } - - @Override - public Map> layOut(GuiContainer container, ReadableDimension size) { - int x = 0; - int spacing = 0; - Map> map = new LinkedHashMap<>(); - for (Map.Entry entry : container.getElements().entrySet()) { - x += spacing; - spacing = this.spacing; - - GuiElement element = entry.getKey(); - Data data = entry.getValue() instanceof Data ? (Data) entry.getValue() : DEFAULT_DATA; - Dimension elementSize = new Dimension(element.getMinSize()); - ReadableDimension elementMaxSize = element.getMaxSize(); - elementSize.setWidth(Math.min(size.getWidth() - x, Math.min(elementSize.getWidth(), elementMaxSize.getWidth()))); - elementSize.setHeight(Math.min(size.getHeight(), elementMaxSize.getHeight())); - int remainingHeight = size.getHeight() - elementSize.getHeight(); - int y = (int) (data.alignment * remainingHeight); - map.put(element, Pair.of(new Point(x, y), elementSize)); - x += elementSize.getWidth(); - } - if (alignment != Alignment.LEFT) { - int remaining = size.getWidth() - x; - if (alignment == Alignment.CENTER) { - remaining /= 2; - } - for (Pair pair : map.values()) { - ((Point) pair.getLeft()).translate(remaining, 0); - } - } - return map; - } - - @Override - public ReadableDimension calcMinSize(GuiContainer container) { - int maxHeight = 0; - int width = 0; - int spacing = 0; - for (Map.Entry entry : container.getElements().entrySet()) { - width += spacing; - spacing = this.spacing; - - GuiElement element = entry.getKey(); - ReadableDimension minSize = element.getMinSize(); - int height = minSize.getHeight(); - if (height > maxHeight) { - maxHeight = height; - } - width += minSize.getWidth(); - } - return new Dimension(width, maxHeight); - } - - public int getSpacing() { - return this.spacing; - } - - public HorizontalLayout setSpacing(int spacing) { - this.spacing = spacing; - return this; - } - - public static class Data implements LayoutData { - private double alignment; - - public Data() { - this(0); - } - - public Data(double alignment) { - this.alignment = alignment; - } - - public double getAlignment() { - return this.alignment; - } - - public void setAlignment(double alignment) { - this.alignment = alignment; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Data data = (Data) o; - return Double.compare(data.alignment, alignment) == 0; - } - - @Override - public int hashCode() { - return Objects.hash(alignment); - } - - @Override - public String toString() { - return "Data{" + - "alignment=" + alignment + - '}'; - } - } - - public enum Alignment { - LEFT, RIGHT, CENTER - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/Layout.java b/jGui/src/main/java/de/johni0702/minecraft/gui/layout/Layout.java deleted file mode 100644 index e00cfaf4..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/Layout.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.layout; - -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Map; - -public interface Layout { - - Map> layOut(GuiContainer container, ReadableDimension size); - - ReadableDimension calcMinSize(GuiContainer container); - -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/LayoutData.java b/jGui/src/main/java/de/johni0702/minecraft/gui/layout/LayoutData.java deleted file mode 100644 index aaf4c2c2..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/LayoutData.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.layout; - -public interface LayoutData { - LayoutData NONE = VoidLayoutData.INSTANCE; -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/VerticalLayout.java b/jGui/src/main/java/de/johni0702/minecraft/gui/layout/VerticalLayout.java deleted file mode 100644 index 208d540b..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/VerticalLayout.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.layout; - -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Objects; - -public class VerticalLayout implements Layout { - private static final Data DEFAULT_DATA = new Data(0); - - private final Alignment alignment; - - private int spacing; - - public VerticalLayout() { - this(Alignment.TOP); - } - - public VerticalLayout(Alignment alignment) { - this.alignment = alignment; - } - - @Override - public Map> layOut(GuiContainer container, ReadableDimension size) { - int y = 0; - int spacing = 0; - Map> map = new LinkedHashMap<>(); - for (Map.Entry entry : container.getElements().entrySet()) { - y += spacing; - spacing = this.spacing; - - GuiElement element = entry.getKey(); - Data data = entry.getValue() instanceof Data ? (Data) entry.getValue() : DEFAULT_DATA; - Dimension elementSize = new Dimension(element.getMinSize()); - ReadableDimension elementMaxSize = element.getMaxSize(); - elementSize.setHeight(Math.min(size.getHeight() - y, Math.min(elementSize.getHeight(), elementMaxSize.getHeight()))); - elementSize.setWidth(Math.min(size.getWidth(), (data.maximizeWidth ? elementMaxSize : elementSize).getWidth())); - int remainingWidth = size.getWidth() - elementSize.getWidth(); - int x = (int) (data.alignment * remainingWidth); - map.put(element, Pair.of(new Point(x, y), elementSize)); - y += elementSize.getHeight(); - } - if (alignment != Alignment.TOP) { - int remaining = size.getHeight() - y; - if (alignment == Alignment.CENTER) { - remaining /= 2; - } - for (Pair pair : map.values()) { - ((Point) pair.getLeft()).translate(0, remaining); - } - } - return map; - } - - @Override - public ReadableDimension calcMinSize(GuiContainer container) { - int maxWidth = 0; - int height = 0; - int spacing = 0; - for (Map.Entry entry : container.getElements().entrySet()) { - height += spacing; - spacing = this.spacing; - - GuiElement element = entry.getKey(); - ReadableDimension minSize = element.getMinSize(); - int width = minSize.getWidth(); - if (width > maxWidth) { - maxWidth = width; - } - height += minSize.getHeight(); - } - return new Dimension(maxWidth, height); - } - - public int getSpacing() { - return this.spacing; - } - - public VerticalLayout setSpacing(int spacing) { - this.spacing = spacing; - return this; - } - - public static class Data implements LayoutData { - private double alignment; - private boolean maximizeWidth; - - public Data() { - this(0); - } - - public Data(double alignment) { - this(alignment, true); - } - - public Data(double alignment, boolean maximizeWidth) { - this.alignment = alignment; - this.maximizeWidth = maximizeWidth; - } - - public double getAlignment() { - return this.alignment; - } - - public boolean isMaximizeWidth() { - return this.maximizeWidth; - } - - public void setAlignment(double alignment) { - this.alignment = alignment; - } - - public void setMaximizeWidth(boolean maximizeWidth) { - this.maximizeWidth = maximizeWidth; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Data data = (Data) o; - return Double.compare(data.alignment, alignment) == 0 && - maximizeWidth == data.maximizeWidth; - } - - @Override - public int hashCode() { - return Objects.hash(alignment, maximizeWidth); - } - - @Override - public String toString() { - return "Data{" + - "alignment=" + alignment + - ", maximizeWidth=" + maximizeWidth + - '}'; - } - } - - public enum Alignment { - TOP, BOTTOM, CENTER - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/VoidLayoutData.java b/jGui/src/main/java/de/johni0702/minecraft/gui/layout/VoidLayoutData.java deleted file mode 100644 index d20a9c27..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/layout/VoidLayoutData.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.layout; - -public class VoidLayoutData implements LayoutData { - public static final VoidLayoutData INSTANCE = new VoidLayoutData(); - - private VoidLayoutData() { - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/popup/AbstractGuiPopup.java b/jGui/src/main/java/de/johni0702/minecraft/gui/popup/AbstractGuiPopup.java deleted file mode 100644 index 7f41e16e..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/popup/AbstractGuiPopup.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.popup; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.AbstractGuiContainer; -import de.johni0702.minecraft.gui.container.AbstractGuiOverlay; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.container.GuiPanel; -import de.johni0702.minecraft.gui.layout.CustomLayout; -import de.johni0702.minecraft.gui.layout.Layout; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; - -import java.util.function.Function; - -public abstract class AbstractGuiPopup> extends AbstractGuiContainer { - private final GuiPanel popupContainer = new GuiPanel(this){ - private final int u0 = 0; - private final int v0 = 39; - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - if (renderInfo.getLayer() == 0 && renderBackground) { - renderer.bindTexture(TEXTURE); - int w = size.getWidth(); - int h = size.getHeight(); - - // Corners - renderer.drawTexturedRect(0, 0, u0, v0, 5, 5); // Top left - renderer.drawTexturedRect(w - 5, 0, u0 + 12, v0, 5, 5); // Top right - renderer.drawTexturedRect(0, h - 5, u0, v0 + 12, 5, 5); // Bottom left - renderer.drawTexturedRect(w - 5, h - 5, u0 + 12, v0 + 12, 5, 5); // Bottom right - - // Top and bottom edge - for (int x = 5; x < w - 5; x += 5) { - int rx = Math.min(5, w - 5 - x); - renderer.drawTexturedRect(x, 0, u0 + 6, v0, rx, 5); // Top - renderer.drawTexturedRect(x, h - 5, u0 + 6, v0 + 12, rx, 5); // Bottom - } - - // Left and right edge - for (int y = 5; y < h - 5; y += 5) { - int ry = Math.min(5, h - 5 - y); - renderer.drawTexturedRect(0, y, u0, v0 + 6, 5, ry); // Left - renderer.drawTexturedRect(w - 5, y, u0 + 12, v0 + 6, 5, ry); // Right - } - - // Center - for (int x = 5; x < w - 5; x += 5) { - for (int y = 5; y < h - 5; y += 5) { - int rx = Math.min(5, w - 5 - x); - int ry = Math.min(5, h - 5 - y); - renderer.drawTexturedRect(x, y, u0 + 6, v0 + 6, rx, ry); - } - } - } - - super.draw(renderer, size, renderInfo); - } - }.setLayout(new CustomLayout() { - @Override - protected void layout(GuiPanel container, int width, int height) { - pos(popup, 10, 10); - } - - @Override - public ReadableDimension calcMinSize(GuiContainer container) { - ReadableDimension size = popup.calcMinSize(); - return new Dimension(size.getWidth() + 20, size.getHeight() + 20); - } - }); - protected final GuiPanel popup = new GuiPanel(popupContainer); - - private int layer; - - { - setLayout(new CustomLayout() { - @Override - protected void layout(T container, int width, int height) { - pos(popupContainer, width / 2 - width(popupContainer) / 2, height / 2 - height(popupContainer) / 2); - } - }); - } - - private Layout originalLayout; - private boolean wasAllowUserInput; - private boolean wasMouseVisible; - private boolean renderBackground = true; - - private final GuiContainer container; - - public AbstractGuiPopup(GuiContainer container) { - while (container.getContainer() != null) { - container = container.getContainer(); - } - this.container = container; - } - - protected void disablePopupBackground() { - this.renderBackground = false; - } - - protected void open() { - setLayer(container.getMaxLayer() + 1); - container.addElements(null, this); - container.setLayout(new CustomLayout(originalLayout = container.getLayout()) { - @Override - protected void layout(GuiContainer container, int width, int height) { - pos(AbstractGuiPopup.this, 0, 0); - size(AbstractGuiPopup.this, width, height); - } - }); - if (container instanceof AbstractGuiOverlay) { - // Popup opened on a overlay gui. These normally allow interaction with the game world which - // is undesirable when e.g. typing text into a input field. Therefore we disable user input. - AbstractGuiOverlay overlay = (AbstractGuiOverlay) container; - wasAllowUserInput = overlay.isAllowUserInput(); - overlay.setAllowUserInput(false); - // We also force the mouse to be visible - wasMouseVisible = overlay.isMouseVisible(); - overlay.setMouseVisible(true); - } - } - - protected void close() { - getContainer().setLayout(originalLayout); - getContainer().removeElement(this); - if (container instanceof AbstractGuiOverlay) { - AbstractGuiOverlay overlay = (AbstractGuiOverlay) container; - overlay.setAllowUserInput(wasAllowUserInput); - overlay.setMouseVisible(wasMouseVisible); - } - } - - public T setLayer(int layer) { - this.layer = layer; - return getThis(); - } - - @Override - public int getLayer() { - return layer; - } - - @Override - public boolean invokeHandlers(int layer, Class ofType, Function handle) { - // Consume any event which could otherwise reach elements below our popup - return super.invokeHandlers(layer, ofType, handle) || layer <= 0; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiFileChooserPopup.java b/jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiFileChooserPopup.java deleted file mode 100644 index f90a991e..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiFileChooserPopup.java +++ /dev/null @@ -1,351 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.popup; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.RenderInfo; -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.container.GuiPanel; -import de.johni0702.minecraft.gui.container.GuiScrollable; -import de.johni0702.minecraft.gui.container.GuiVerticalList; -import de.johni0702.minecraft.gui.element.GuiButton; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.element.GuiTextField; -import de.johni0702.minecraft.gui.element.advanced.GuiDropdownMenu; -import de.johni0702.minecraft.gui.function.Typeable; -import de.johni0702.minecraft.gui.layout.CustomLayout; -import de.johni0702.minecraft.gui.layout.HorizontalLayout; -import de.johni0702.minecraft.gui.layout.VerticalLayout; -import de.johni0702.minecraft.gui.utils.Colors; -import de.johni0702.minecraft.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.versions.MCVer; - -import java.io.File; -import java.io.IOException; -import java.nio.file.InvalidPathException; -import java.util.*; -import java.util.concurrent.CompletableFuture; - -//#if MC>=11400 -import de.johni0702.minecraft.gui.versions.MCVer.Keyboard; -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif - -public class GuiFileChooserPopup extends AbstractGuiPopup implements Typeable { - public static GuiFileChooserPopup openSaveGui(GuiContainer container, String buttonLabel, String...fileExtensions) { - GuiFileChooserPopup popup = new GuiFileChooserPopup(container, fileExtensions, false).setBackgroundColor(Colors.DARK_TRANSPARENT); - popup.acceptButton.setI18nLabel(buttonLabel); - popup.open(); - return popup; - } - - public static GuiFileChooserPopup openLoadGui(GuiContainer container, String buttonLabel, String...fileExtensions) { - GuiFileChooserPopup popup = new GuiFileChooserPopup(container, fileExtensions, true).setBackgroundColor(Colors.DARK_TRANSPARENT); - popup.acceptButton.setI18nLabel(buttonLabel).setDisabled(); - popup.open(); - return popup; - } - - private Consumer onAccept = (file) -> {}; - private Runnable onCancel = () -> {}; - - private final GuiScrollable pathScrollable = new GuiScrollable(popup) { - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - scrollX(0); - super.draw(renderer, size, renderInfo); - } - }; - private final GuiPanel pathPanel = new GuiPanel(pathScrollable).setLayout(new HorizontalLayout()); - private final GuiVerticalList fileList = new GuiVerticalList(popup); - private final GuiTextField nameField = new GuiTextField(popup).onEnter(new Runnable() { - @Override - public void run() { - if (acceptButton.isEnabled()) { - acceptButton.onClick(); - } - } - }).onTextChanged(new Consumer() { - @Override - public void consume(String oldName) { - updateButton(); - } - }).setMaxLength(Integer.MAX_VALUE); - - private final GuiButton acceptButton = new GuiButton(popup).onClick(new Runnable() { - @Override - public void run() { - String fileName = nameField.getText(); - if (!load && fileExtensions.length > 0) { - if (!hasValidExtension(fileName)) { - fileName = fileName + "." + fileExtensions[0]; - } - } - onAccept.consume(new File(folder, fileName)); - close(); - } - }).setSize(50, 20); - - private final GuiButton cancelButton = new GuiButton(popup).onClick(new Runnable() { - @Override - public void run() { - onCancel.run(); - close(); - } - }).setI18nLabel("gui.cancel").setSize(50, 20); - - { - fileList.setLayout(new VerticalLayout().setSpacing(1)); - popup.setLayout(new CustomLayout() { - @Override - protected void layout(GuiPanel container, int width, int height) { - pos(pathScrollable, 0, 0); - size(pathScrollable, width, 20); - pos(cancelButton, width - width(cancelButton), height - height(cancelButton)); - pos(acceptButton, x(cancelButton) - 5 - width(acceptButton), y(cancelButton)); - size(nameField, x(acceptButton) - 5, 20); - pos(nameField, 0, height - height(nameField)); - pos(fileList, 0, y(pathScrollable) + height(pathScrollable) + 5); - size(fileList, width, y(nameField) - y(fileList) - 5); - } - - @Override - public ReadableDimension calcMinSize(GuiContainer container) { - return new Dimension(300, 200); - } - }); - } - - private final String[] fileExtensions; - private final boolean load; - - private File folder; - - public GuiFileChooserPopup(GuiContainer container, String[] fileExtensions, boolean load) { - super(container); - this.fileExtensions = fileExtensions; - this.load = load; - - setFolder(new File(".")); - } - - protected void updateButton() { - String name = nameField.getText(); - File file = new File(folder, name); - - // File name must not contain - boolean valid = !name.contains(File.separator); - - // Name must not contain any illegal characters (depends on OS) - try { - //noinspection ResultOfMethodCallIgnored - file.toPath(); - } catch (InvalidPathException ignored) { - valid = false; - } - - // If we're loading, the file must exist - if (load) { - valid &= file.exists(); - } - - acceptButton.setEnabled(valid); - } - - public void setFolder(File folder) { - if (!folder.isDirectory()) { - throw new IllegalArgumentException("Folder has to be a directory."); - } - try { - this.folder = folder = folder.getCanonicalFile(); - } catch (IOException e) { - close(); - throw new RuntimeException(e); - } - - updateButton(); - - for (GuiElement element : new ArrayList<>(pathPanel.getElements().keySet())) { - pathPanel.removeElement(element); - } - for (GuiElement element : new ArrayList<>(fileList.getListPanel().getElements().keySet())) { - fileList.getListPanel().removeElement(element); - } - - File[] files = folder.listFiles(); - if (files != null) { - Arrays.sort(files, new Comparator() { - @Override - public int compare(File f1, File f2) { - if (f1.isDirectory() && !f2.isDirectory()) { - return -1; - } else if (!f1.isDirectory() && f2.isDirectory()) { - return 1; - } - return f1.getName().compareToIgnoreCase(f2.getName()); - } - }); - for (final File file : files) { - if (file.isDirectory()) { - fileList.getListPanel().addElements(new VerticalLayout.Data(0), new GuiButton().onClick(new Runnable() { - @Override - public void run() { - setFolder(file); - } - }).setLabel(file.getName() + File.separator)); - } else { - if (hasValidExtension(file.getName())) { - fileList.getListPanel().addElements(new VerticalLayout.Data(0), new GuiButton().onClick(new Runnable() { - @Override - public void run() { - setFileName(file.getName()); - } - }).setLabel(file.getName())); - } - } - } - } - fileList.setOffsetY(0); - - File[] roots = File.listRoots(); - if (roots != null && roots.length > 1) { - // Windows can have multiple file system roots - // So we place a dropdown menu (skinned like a button) at the front of the path - final GuiDropdownMenu dropdown = new GuiDropdownMenu(pathPanel) { - private final GuiButton skin = new GuiButton(); - - @Override - protected ReadableDimension calcMinSize() { - ReadableDimension dim = super.calcMinSize(); - return new Dimension(dim.getWidth() - 5 - MCVer.getFontRenderer().fontHeight, - dim.getHeight()); - } - - @Override - public void layout(ReadableDimension size, RenderInfo renderInfo) { - super.layout(size, renderInfo); - if (renderInfo.layer == 0) { - skin.layout(size, renderInfo); - } - } - - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - super.draw(renderer, size, renderInfo); - if (renderInfo.layer == 0) { - skin.setLabel(getSelectedValue().toString()); - skin.draw(renderer, size, renderInfo); - } - } - }; - List actualRoots = new ArrayList<>(); - File selected = null; - for (File root : roots) { - // Windows apparently also has file system roots that aren't directories, so we'll have to filter those - if (root.isDirectory()) { - actualRoots.add(root); - if (folder.getAbsolutePath().startsWith(root.getAbsolutePath())) { - selected = root; - } - } - } - assert selected != null; - // First set values and current selection - dropdown.setValues(actualRoots.toArray(new File[actualRoots.size()])).setSelected(selected); - // then add selection handler afterwards - dropdown.onSelection(new Consumer() { - @Override - public void consume(Integer old) { - setFolder(dropdown.getSelectedValue()); - } - }); - } - LinkedList parents = new LinkedList<>(); - while (folder != null) { - parents.addFirst(folder); - folder = folder.getParentFile(); - } - for (final File parent : parents) { - pathPanel.addElements(null, new GuiButton().onClick(new Runnable() { - @Override - public void run() { - setFolder(parent); - } - }).setLabel(parent.getName() + File.separator)); - } - pathScrollable.setOffsetX(Integer.MAX_VALUE); - } - - public void setFileName(String fileName) { - this.nameField.setText(fileName); - this.nameField.setCursorPosition(fileName.length()); - updateButton(); - } - - private boolean hasValidExtension(String name) { - for (String fileExtension : fileExtensions) { - if (name.endsWith("." + fileExtension)) { - return true; - } - } - return false; - } - - @Override - protected GuiFileChooserPopup getThis() { - return this; - } - - public GuiFileChooserPopup onAccept(Consumer onAccept) { - this.onAccept = onAccept; - return this; - } - - public GuiFileChooserPopup onCancel(Runnable onCancel) { - this.onCancel = onCancel; - return this; - } - - @Override - public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { - if (keyCode == Keyboard.KEY_ESCAPE) { - cancelButton.onClick(); - return true; - } - return false; - } - - public GuiButton getAcceptButton() { - return this.acceptButton; - } - - public GuiButton getCancelButton() { - return this.cancelButton; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiInfoPopup.java b/jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiInfoPopup.java deleted file mode 100644 index 007b22be..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiInfoPopup.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.popup; - -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.container.GuiPanel; -import de.johni0702.minecraft.gui.element.GuiButton; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.element.GuiLabel; -import de.johni0702.minecraft.gui.function.Typeable; -import de.johni0702.minecraft.gui.layout.VerticalLayout; -import de.johni0702.minecraft.gui.utils.Colors; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -//#if MC>=11400 -import de.johni0702.minecraft.gui.versions.MCVer.Keyboard; -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif - -public class GuiInfoPopup extends AbstractGuiPopup implements Typeable { - public static GuiInfoPopup open(GuiContainer container, String...info) { - GuiElement[] labels = new GuiElement[info.length]; - for (int i = 0; i < info.length; i++) { - labels[i] = new GuiLabel().setI18nText(info[i]).setColor(Colors.BLACK); - } - return open(container, labels); - } - - public static GuiInfoPopup open(GuiContainer container, GuiElement... info) { - GuiInfoPopup popup = new GuiInfoPopup(container).setBackgroundColor(Colors.DARK_TRANSPARENT); - popup.getInfo().addElements(new VerticalLayout.Data(0.5), info); - popup.open(); - return popup; - } - - private Runnable onClosed = () -> {}; - - private final GuiButton closeButton = new GuiButton().setSize(150, 20).onClick(() -> { - close(); - onClosed.run(); - }).setI18nLabel("gui.back"); - - private final GuiPanel info = new GuiPanel().setMinSize(new Dimension(320, 50)) - .setLayout(new VerticalLayout(VerticalLayout.Alignment.TOP).setSpacing(2)); - - { - popup.setLayout(new VerticalLayout().setSpacing(10)) - .addElements(new VerticalLayout.Data(0.5), info, closeButton); - } - - private int layer; - - public GuiInfoPopup(GuiContainer container) { - super(container); - } - - public GuiInfoPopup setCloseLabel(String label) { - closeButton.setLabel(label); - return this; - } - - public GuiInfoPopup setCloseI18nLabel(String label, Object...args) { - closeButton.setI18nLabel(label, args); - return this; - } - - public GuiInfoPopup onClosed(Runnable onClosed) { - this.onClosed = onClosed; - return this; - } - - @Override - protected GuiInfoPopup getThis() { - return this; - } - - @Override - public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { - if (keyCode == Keyboard.KEY_ESCAPE) { - closeButton.onClick(); - return true; - } - return false; - } - - public GuiButton getCloseButton() { - return this.closeButton; - } - - public GuiPanel getInfo() { - return this.info; - } - - public int getLayer() { - return this.layer; - } - - public GuiInfoPopup setLayer(int layer) { - this.layer = layer; - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiYesNoPopup.java b/jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiYesNoPopup.java deleted file mode 100644 index 97b252cd..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/popup/GuiYesNoPopup.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.popup; - -import de.johni0702.minecraft.gui.container.GuiContainer; -import de.johni0702.minecraft.gui.container.GuiPanel; -import de.johni0702.minecraft.gui.element.GuiButton; -import de.johni0702.minecraft.gui.element.GuiElement; -import de.johni0702.minecraft.gui.function.Typeable; -import de.johni0702.minecraft.gui.layout.HorizontalLayout; -import de.johni0702.minecraft.gui.layout.VerticalLayout; -import de.johni0702.minecraft.gui.utils.Colors; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; - -//#if MC>=11400 -import de.johni0702.minecraft.gui.versions.MCVer.Keyboard; -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif - -import java.util.function.Consumer; - -public class GuiYesNoPopup extends AbstractGuiPopup implements Typeable { - public static GuiYesNoPopup open(GuiContainer container, GuiElement... info) { - GuiYesNoPopup popup = new GuiYesNoPopup(container).setBackgroundColor(Colors.DARK_TRANSPARENT); - popup.getInfo().addElements(new VerticalLayout.Data(0.5), info); - popup.open(); - return popup; - } - - private Consumer onClosed = (accepted) -> {}; - private Runnable onAccept = () -> {}; - private Runnable onReject = () -> {}; - - private final GuiButton yesButton = new GuiButton().setSize(150, 20).onClick(new Runnable() { - @Override - public void run() { - close(); - onAccept.run(); - onClosed.accept(true); - } - }); - - private final GuiButton noButton = new GuiButton().setSize(150, 20).onClick(new Runnable() { - @Override - public void run() { - close(); - onReject.run(); - onClosed.accept(false); - } - }); - - private final GuiPanel info = new GuiPanel().setMinSize(new Dimension(320, 50)) - .setLayout(new VerticalLayout(VerticalLayout.Alignment.TOP).setSpacing(2)); - - private final GuiPanel buttons = new GuiPanel() - .setLayout(new HorizontalLayout(HorizontalLayout.Alignment.CENTER).setSpacing(5)) - .addElements(new HorizontalLayout.Data(0.5), yesButton, noButton); - - { - popup.setLayout(new VerticalLayout().setSpacing(10)) - .addElements(new VerticalLayout.Data(0.5), info, buttons); - } - - private int layer; - - public GuiYesNoPopup(GuiContainer container) { - super(container); - } - - public GuiYesNoPopup setYesLabel(String label) { - yesButton.setLabel(label); - return this; - } - - public GuiYesNoPopup setNoLabel(String label) { - noButton.setLabel(label); - return this; - } - - public GuiYesNoPopup setYesI18nLabel(String label, Object...args) { - yesButton.setI18nLabel(label, args); - return this; - } - - public GuiYesNoPopup setNoI18nLabel(String label, Object...args) { - noButton.setI18nLabel(label, args); - return this; - } - - public GuiYesNoPopup onClosed(Consumer onClosed) { - this.onClosed = onClosed; - return this; - } - - public GuiYesNoPopup onAccept(Runnable onAccept) { - this.onAccept = onAccept; - return this; - } - - public GuiYesNoPopup onReject(Runnable onReject) { - this.onReject = onReject; - return this; - } - - @Override - protected GuiYesNoPopup getThis() { - return this; - } - - @Override - public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { - if (keyCode == Keyboard.KEY_ESCAPE) { - noButton.onClick(); - return true; - } - return false; - } - - public GuiButton getYesButton() { - return this.yesButton; - } - - public GuiButton getNoButton() { - return this.noButton; - } - - public GuiPanel getInfo() { - return this.info; - } - - public GuiPanel getButtons() { - return this.buttons; - } - - public int getLayer() { - return this.layer; - } - - public GuiYesNoPopup setLayer(int layer) { - this.layer = layer; - return this; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Colors.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Colors.java deleted file mode 100644 index f6265510..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Colors.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.utils; - - -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; - -public interface Colors extends ReadableColor { - ReadableColor TRANSPARENT = new Color(0, 0, 0, 0); - ReadableColor LIGHT_TRANSPARENT = new Color(0, 0, 0, 64); - ReadableColor HALF_TRANSPARENT = new Color(0, 0, 0, 128); - ReadableColor DARK_TRANSPARENT = new Color(0, 0, 0, 192); - ReadableColor LIGHT_GRAY = new Color(192, 192, 192); - ReadableColor DARK_RED = new Color(170, 0, 0); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Consumer.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Consumer.java deleted file mode 100644 index cc209ec0..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Consumer.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.utils; - -public interface Consumer { - void consume(T obj); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Consumers.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Consumers.java deleted file mode 100644 index 900731b3..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Consumers.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.utils; - -public class Consumers { - public static Consumer from(final Runnable runnable) { - return new Consumer() { - @Override - public void consume(U obj) { - runnable.run(); - } - }; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Event.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Event.java deleted file mode 100644 index c40c268e..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Event.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.johni0702.minecraft.gui.utils; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; - -public class Event { - public static Event create(Function, T> invokerFactory) { - return new Event<>(invokerFactory); - } - - private T invoker; - private Function, T> invokerFactory; - private List listeners = new ArrayList<>(); - - private Event(Function, T> invokerFactory) { - this.invokerFactory = invokerFactory; - update(); - } - - void register(T listener) { - listeners.add(listener); - update(); - } - - void unregister(T listener) { - listeners.remove(listener); - update(); - } - - private void update() { - invoker = invokerFactory.apply(new ArrayList<>(listeners)); - } - - public T invoker() { - return invoker; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/EventRegistration.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/EventRegistration.java deleted file mode 100644 index 794ea22a..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/EventRegistration.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.johni0702.minecraft.gui.utils; - -public class EventRegistration { - public static EventRegistration create(Event event, T callback) { - return new EventRegistration<>(event, callback); - } - - public static EventRegistration register(Event event, T callback) { - EventRegistration registration = new EventRegistration<>(event, callback); - registration.register(); - return registration; - } - - private final Event event; - private final T listener; - private boolean registered; - - private EventRegistration(Event event, T listener) { - this.event = event; - this.listener = listener; - } - - public void register() { - if (registered) { - throw new IllegalStateException(); - } - - event.register(listener); - registered = true; - } - - public void unregister() { - if (!registered) { - throw new IllegalStateException(); - } - - event.unregister(listener); - registered = false; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/EventRegistrations.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/EventRegistrations.java deleted file mode 100644 index a9a34342..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/EventRegistrations.java +++ /dev/null @@ -1,54 +0,0 @@ -package de.johni0702.minecraft.gui.utils; - -//#if MC<=11302 -//$$ import de.johni0702.minecraft.gui.versions.forge.EventsAdapter; -//$$ import net.minecraftforge.common.MinecraftForge; -//#endif - -//#if MC<10809 -//$$ import net.minecraftforge.fml.common.FMLCommonHandler; -//#endif - -import java.util.ArrayList; -import java.util.List; - -public class EventRegistrations { - //#if FABRIC<1 - //$$ static { new EventsAdapter().register(); } - //#endif - - private List> registrations = new ArrayList<>(); - - public EventRegistrations on(EventRegistration registration) { - registrations.add(registration); - return this; - } - - public EventRegistrations on(Event event, T listener) { - return on(EventRegistration.create(event, listener)); - } - - public void register() { - //#if FABRIC<1 - //$$ MinecraftForge.EVENT_BUS.register(this); - //#endif - //#if MC<10809 - //$$ FMLCommonHandler.instance().bus().register(this); - //#endif - for (EventRegistration registration : registrations) { - registration.register(); - } - } - - public void unregister() { - //#if FABRIC<1 - //$$ MinecraftForge.EVENT_BUS.unregister(this); - //#endif - //#if MC<10809 - //$$ FMLCommonHandler.instance().bus().unregister(this); - //#endif - for (EventRegistration registration : registrations) { - registration.unregister(); - } - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/MouseUtils.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/MouseUtils.java deleted file mode 100644 index 871ff554..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/MouseUtils.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.utils; - -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.MinecraftClient; - -//#if MC>=11400 -import net.minecraft.client.util.Window; -//#else -//$$ import net.minecraft.client.gui.ScaledResolution; -//$$ import org.lwjgl.input.Mouse; -//#endif - -public class MouseUtils { - private static final MinecraftClient mc = MCVer.getMinecraft(); - - public static Point getMousePos() { - //#if MC>=11400 - int mouseX = (int) mc.mouse.getX(); - int mouseY = (int) mc.mouse.getY(); - Window mainWindow = MCVer.newScaledResolution(mc); - mouseX = (int) Math.round((double) mouseX * mainWindow.getScaledWidth() / mainWindow.getWidth()); - mouseY = (int) Math.round((double) mouseY * mainWindow.getScaledHeight() / mainWindow.getHeight()); - //#else - //$$ Point scaled = getScaledDimensions(); - //$$ int width = scaled.getX(); - //$$ int height = scaled.getY(); - //$$ - //$$ int mouseX = (Mouse.getX() * width / mc.displayWidth); - //$$ int mouseY = (height - Mouse.getY() * height / mc.displayHeight); - //#endif - - return new Point(mouseX, mouseY); - } - - public static Point getScaledDimensions() { - //#if MC>=11400 - Window - //#else - //$$ ScaledResolution - //#endif - res = MCVer.newScaledResolution(mc); - return new Point(res.getScaledWidth(), res.getScaledHeight()); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/NonNull.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/NonNull.java deleted file mode 100644 index d6338285..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/NonNull.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.johni0702.minecraft.gui.utils; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Target; - -@Target({ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PARAMETER}) -public @interface NonNull { -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/StringUtils.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/StringUtils.java deleted file mode 100644 index 8d49a075..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/StringUtils.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.utils; - -import de.johni0702.minecraft.gui.versions.MCVer; -import net.minecraft.client.font.TextRenderer; - -import java.util.ArrayList; -import java.util.List; - -public class StringUtils { - public static String[] splitStringInMultipleRows(String string, int maxWidth) { - if(string == null) return new String[0]; - TextRenderer fontRenderer = MCVer.getFontRenderer(); - List rows = new ArrayList<>(); - String remaining = string; - while(remaining.length() > 0) { - String[] split = remaining.split(" "); - String b = ""; - for(String sp : split) { - b += sp + " "; - if (fontRenderer.getWidth(b.trim()) > maxWidth) { - b = b.substring(0, b.trim().length() - (sp.length())); - break; - } - } - String trimmed = b.trim(); - rows.add(trimmed); - try { - remaining = remaining.substring(trimmed.length() + 1); - } catch(Exception e) { - break; - } - } - - return rows.toArray(new String[rows.size()]); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Utils.java b/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Utils.java deleted file mode 100644 index 111f48a2..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/utils/Utils.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This file is part of jGui API, licensed under the MIT License (MIT). - * - * Copyright (c) 2016 johni0702 - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package de.johni0702.minecraft.gui.utils; - -import de.johni0702.minecraft.gui.GuiRenderer; -import de.johni0702.minecraft.gui.function.Focusable; - -import java.util.Arrays; -import java.util.HashSet; - -import static com.google.common.base.Preconditions.checkArgument; - -public class Utils { - /** - * Interval (in ms) within which two clicks have to be made on the same element to be counted as a double click. - */ - public static final int DOUBLE_CLICK_INTERVAL = 250; - - /** - * Link the specified focusable compontents in the order they're supplied. - * @param focusables Focusables to link - * @see Focusable#setNext(Focusable) - * @see Focusable#setPrevious(Focusable) - */ - public static void link(Focusable... focusables) { - checkArgument(new HashSet<>(Arrays.asList(focusables)).size() == focusables.length, "focusables must be unique and not null"); - for (int i = 0; i < focusables.length; i++) { - Focusable next = focusables[(i + 1) % focusables.length]; - focusables[i].setNext(next); - next.setPrevious(focusables[i]); - } - } - - public static void drawDynamicRect(GuiRenderer renderer, int width, int height, int u, int v, int uWidth, int vHeight, - int topBorder, int bottomBorder, int leftBorder, int rightBorder) { - int textureBodyHeight = vHeight - topBorder - bottomBorder; - int textureBodyWidth = uWidth - leftBorder - rightBorder; - // Left and right borders - for (int pass = 0; pass < 2; pass++) { - int x = pass == 0 ? 0 : width - rightBorder; - int textureX = pass == 0 ? u : u + uWidth - rightBorder; - // Border - for (int y = topBorder; y < height - bottomBorder; y += textureBodyHeight) { - int segmentHeight = Math.min(textureBodyHeight, height - bottomBorder - y); - renderer.drawTexturedRect(x, y, textureX, v + topBorder, leftBorder, segmentHeight); - } - // Top corner - renderer.drawTexturedRect(x, 0, textureX, v, leftBorder, topBorder); - // Bottom corner - renderer.drawTexturedRect(x, height - bottomBorder, textureX, v + vHeight - bottomBorder, - leftBorder, bottomBorder); - } - - for (int x = leftBorder; x < width - rightBorder; x += textureBodyWidth) { - int segmentWidth = Math.min(textureBodyWidth, width - rightBorder - x); - int textureX = u + leftBorder; - - // Content - for (int y = topBorder; y < height - bottomBorder; y += textureBodyHeight) { - int segmentHeight = Math.min(textureBodyHeight, height - bottomBorder - y); - renderer.drawTexturedRect(x, y, textureX, v + topBorder, segmentWidth, segmentHeight); - } - - // Top border - renderer.drawTexturedRect(x, 0, textureX, v, segmentWidth, topBorder); - // Bottom border - renderer.drawTexturedRect(x, height - bottomBorder, textureX, v + vHeight - bottomBorder, - segmentWidth, bottomBorder); - } - } - - public static int clamp(int val, int min, int max) { - return val < min ? min : val > max ? max : val; - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/Image.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/Image.java deleted file mode 100644 index 1a094095..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/Image.java +++ /dev/null @@ -1,114 +0,0 @@ -package de.johni0702.minecraft.gui.versions; - -import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.texture.NativeImageBackedTexture; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Path; - -/** - * As of LWJGL 3, AWT must never be initialized, otherwise GLFW will be broken on OSX. - * **Any** usage of BufferedImage will initialize AWT (static initializer). - * E.g. https://www.replaymod.com/forum/thread/2566 - */ -public class Image implements AutoCloseable { - private NativeImage inner; - - public Image(int width, int height) { - this( - //#if FABRIC>=1 - new NativeImage(NativeImage.Format.ABGR, width, height, true) - //#else - //$$ new NativeImage(NativeImage.PixelFormat.RGBA, width, height, true) - //#endif - ); - } - - public Image(NativeImage inner) { - this.inner = inner; - } - - public NativeImage getInner() { - return inner; - } - - @Override - protected void finalize() throws Throwable { - // Great, now we're using a language with GC but still need to take care of memory management.. thanks MC - close(); - super.finalize(); - } - - @Override - public void close() { - if (inner != null) { - inner.close(); - inner = null; - } - } - - public int getWidth() { - return inner.getWidth(); - } - - public int getHeight() { - return inner.getHeight(); - } - - public void setRGBA(int x, int y, int r, int g, int b, int a) { - // actually takes ABGR, not RGBA - inner.setPixelColor(x, y, ((a & 0xff) << 24) | ((b & 0xff) << 16) | ((g & 0xff) << 8) | (r & 0xff)); - } - - public static Image read(Path path) throws IOException { - return read(Files.newInputStream(path)); - } - - public static Image read(InputStream in) throws IOException { - return new Image(NativeImage.read(in)); - } - - public void writePNG(File file) throws IOException { - inner.writeFile(file); - } - - public void writePNG(OutputStream outputStream) throws IOException { - Path tmp = Files.createTempFile("tmp", ".png"); - try { - inner.writeFile(tmp); - Files.copy(tmp, outputStream); - } finally { - Files.delete(tmp); - } - } - - public Image scaledSubRect(int x, int y, int width, int height, int scaledWidth, int scaledHeight) { - NativeImage dst = new NativeImage(inner.getFormat(), scaledWidth, scaledHeight, false); - inner.resizeSubRectTo(x, y, width, height, dst); - return new Image(dst); - } - - @Deprecated // BufferedImage should not be used on 1.13+, see class docs - public BufferedImage toBufferedImage() { - // Not very efficient but certainly the easiest solution. - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try { - writePNG(out); - return ImageIO.read(new ByteArrayInputStream(out.toByteArray())); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public NativeImageBackedTexture toTexture() { - return new NativeImageBackedTexture(inner); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/MCVer.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/MCVer.java deleted file mode 100644 index c9084c86..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/MCVer.java +++ /dev/null @@ -1,218 +0,0 @@ -package de.johni0702.minecraft.gui.versions; - -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.Tessellator; -import net.minecraft.util.crash.CrashReportSection; -import org.lwjgl.opengl.GL11; - -//#if FABRIC>=1 -//#else -//$$ import net.minecraftforge.client.event.GuiScreenEvent; -//$$ import net.minecraftforge.client.event.RenderGameOverlayEvent; -//#endif - -//#if MC>=11400 -import net.minecraft.client.util.Window; -import org.lwjgl.glfw.GLFW; -//#else -//$$ import net.minecraft.client.gui.GuiScreen; -//$$ import net.minecraft.client.gui.ScaledResolution; -//#endif - -//#if MC>=10809 -import net.minecraft.client.render.VertexFormats; -//#endif - -//#if MC<10800 -//$$ import net.minecraft.client.renderer.OpenGlHelper; -//$$ import static org.lwjgl.opengl.GL11.*; -//#endif - -import java.util.concurrent.Callable; - -/** - * Abstraction over things that have changed between different MC versions. - */ -public class MCVer { - public static MinecraftClient getMinecraft() { - return MinecraftClient.getInstance(); - } - - //#if MC>=11400 - public static Window newScaledResolution(MinecraftClient mc) { - //#if MC>=11500 - return mc.getWindow(); - //#else - //$$ return mc.window; - //#endif - } - //#else - //$$ public static ScaledResolution newScaledResolution(Minecraft mc) { - //#if MC>=10809 - //$$ return new ScaledResolution(mc); - //#else - //$$ return new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); - //#endif - //$$ } - //#endif - - public static void addDetail(CrashReportSection category, String name, Callable callable) { - //#if MC>=10904 - //#if MC>=11200 - category.add(name, callable::call); - //#else - //$$ category.setDetail(name, callable::call); - //#endif - //#else - //$$ category.addCrashSectionCallable(name, callable); - //#endif - } - - public static void drawRect(int right, int bottom, int left, int top) { - //#if MC>=10800 - Tessellator tessellator = Tessellator.getInstance(); - //#else - //$$ Tessellator tessellator = Tessellator.instance; - //#endif - //#if MC>=10904 - BufferBuilder vertexBuffer = tessellator.getBuffer(); - //#else - //#if MC>=10800 - //$$ WorldRenderer vertexBuffer = tessellator.getWorldRenderer(); - //#else - //$$ Tessellator vertexBuffer = tessellator; - //#endif - //#endif - //#if MC>=10809 - vertexBuffer.begin(GL11.GL_QUADS, VertexFormats.POSITION); - vertexBuffer.vertex(right, top, 0).next(); - vertexBuffer.vertex(left, top, 0).next(); - vertexBuffer.vertex(left, bottom, 0).next(); - vertexBuffer.vertex(right, bottom, 0).next(); - //#else - //$$ vertexBuffer.startDrawingQuads(); - //$$ vertexBuffer.addVertex(right, top, 0); - //$$ vertexBuffer.addVertex(left, top, 0); - //$$ vertexBuffer.addVertex(left, bottom, 0); - //$$ vertexBuffer.addVertex(right, bottom, 0); - //#endif - tessellator.draw(); - } - - public static void drawRect(int x, int y, int width, int height, ReadableColor tl, ReadableColor tr, ReadableColor bl, ReadableColor br) { - //#if MC>=10800 - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder vertexBuffer = tessellator.getBuffer(); - //#else - //$$ Tessellator tessellator = Tessellator.instance; - //$$ Tessellator vertexBuffer = tessellator; - //#endif - //#if MC>=10809 - vertexBuffer.begin(GL11.GL_QUADS, VertexFormats.POSITION_COLOR); - vertexBuffer.vertex(x, y + height, 0).color(bl.getRed(), bl.getGreen(), bl.getBlue(), bl.getAlpha()).next(); - vertexBuffer.vertex(x + width, y + height, 0).color(br.getRed(), br.getGreen(), br.getBlue(), br.getAlpha()).next(); - vertexBuffer.vertex(x + width, y, 0).color(tr.getRed(), tr.getGreen(), tr.getBlue(), tr.getAlpha()).next(); - vertexBuffer.vertex(x, y, 0).color(tl.getRed(), tl.getGreen(), tl.getBlue(), tl.getAlpha()).next(); - //#else - //$$ vertexBuffer.startDrawingQuads(); - //$$ vertexBuffer.setColorRGBA(bl.getRed(), bl.getGreen(), bl.getBlue(), bl.getAlpha()); - //$$ vertexBuffer.addVertex(x, y + height, 0); - //$$ vertexBuffer.setColorRGBA(br.getRed(), br.getGreen(), br.getBlue(), br.getAlpha()); - //$$ vertexBuffer.addVertex(x + width, y + height, 0); - //$$ vertexBuffer.setColorRGBA(tr.getRed(), tr.getGreen(), tr.getBlue(), tr.getAlpha()); - //$$ vertexBuffer.addVertex(x + width, y, 0); - //$$ vertexBuffer.setColorRGBA(tl.getRed(), tl.getGreen(), tl.getBlue(), tl.getAlpha()); - //$$ vertexBuffer.addVertex(x, y, 0); - //#endif - tessellator.draw(); - } - - public static TextRenderer getFontRenderer() { - return getMinecraft().textRenderer; - } - - //#if FABRIC<=0 - //$$ public static RenderGameOverlayEvent.ElementType getType(RenderGameOverlayEvent event) { - //#if MC>=10904 - //$$ return event.getType(); - //#else - //$$ return event.type; - //#endif - //$$ } - //$$ - //$$ public static int getMouseX(GuiScreenEvent.DrawScreenEvent.Post event) { - //#if MC>=10904 - //$$ return event.getMouseX(); - //#else - //$$ return event.mouseX; - //#endif - //$$ } - //$$ - //$$ public static int getMouseY(GuiScreenEvent.DrawScreenEvent.Post event) { - //#if MC>=10904 - //$$ return event.getMouseY(); - //#else - //$$ return event.mouseY; - //#endif - //$$ } - //#endif - - public static void setClipboardString(String text) { - //#if MC>=11400 - getMinecraft().keyboard.setClipboard(text); - //#else - //$$ GuiScreen.setClipboardString(text); - //#endif - } - - public static String getClipboardString() { - //#if MC>=11400 - return getMinecraft().keyboard.getClipboard(); - //#else - //$$ return GuiScreen.getClipboardString(); - //#endif - } - - //#if MC<=10710 - //$$ public static void color(float r, float g, float b) { GL11.glColor3f(r, g, b); } - //$$ public static void color(float r, float g, float b, float a) { GL11.glColor4f(r, g, b, a); } - //$$ public static void enableBlend() { GL11.glEnable(GL_BLEND); } - //$$ public static void enableTexture2D() { GL11.glEnable(GL_TEXTURE_2D); } - //$$ public static void enableAlpha() { GL11.glEnable(GL_ALPHA_TEST); } - //$$ public static void disableTexture2D() { GL11.glDisable(GL_TEXTURE_2D); } - //$$ public static void disableAlpha() { GL11.glDisable(GL_ALPHA_TEST); } - //$$ public static void blendFunc(int s, int d) { GL11.glBlendFunc(s, d); } - //$$ public static void tryBlendFuncSeparate(int l, int r, int vl, int vr) { OpenGlHelper.glBlendFunc(l, r, vl, vr); } - //$$ public static void shadeModel(int mode) { GL11.glShadeModel(mode); } - //$$ public static void enableColorLogic() { GL11.glEnable(GL_COLOR_LOGIC_OP); } - //$$ public static void disableColorLogic() { GL11.glDisable(GL_COLOR_LOGIC_OP); } - //$$ public static void colorLogicOp(int op) { GL11.glLogicOp(op); } - //#endif - - //#if MC>=11400 - public static abstract class Keyboard { - public static final int KEY_ESCAPE = GLFW.GLFW_KEY_ESCAPE; - public static final int KEY_HOME = GLFW.GLFW_KEY_HOME; - public static final int KEY_END = GLFW.GLFW_KEY_END; - public static final int KEY_UP = GLFW.GLFW_KEY_UP; - public static final int KEY_DOWN = GLFW.GLFW_KEY_DOWN; - public static final int KEY_LEFT = GLFW.GLFW_KEY_LEFT; - public static final int KEY_RIGHT = GLFW.GLFW_KEY_RIGHT; - public static final int KEY_BACK = GLFW.GLFW_KEY_BACKSPACE; - public static final int KEY_DELETE = GLFW.GLFW_KEY_DELETE; - public static final int KEY_RETURN = GLFW.GLFW_KEY_ENTER; - public static final int KEY_TAB = GLFW.GLFW_KEY_TAB; - public static final int KEY_A = GLFW.GLFW_KEY_A; - public static final int KEY_C = GLFW.GLFW_KEY_C; - public static final int KEY_V = GLFW.GLFW_KEY_V; - public static final int KEY_X = GLFW.GLFW_KEY_X; - - public static void enableRepeatEvents(boolean enabled) { - getMinecraft().keyboard.setRepeatEvents(enabled); - } - } - //#endif -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/MatrixStack.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/MatrixStack.java deleted file mode 100644 index 33bd524f..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/MatrixStack.java +++ /dev/null @@ -1 +0,0 @@ -// MC < 1.15 diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/InitScreenCallback.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/InitScreenCallback.java deleted file mode 100644 index 8df683b2..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/InitScreenCallback.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.johni0702.minecraft.gui.versions.callbacks; - -import de.johni0702.minecraft.gui.utils.Event; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.AbstractButtonWidget; - -import java.util.List; - -public interface InitScreenCallback { - Event EVENT = Event.create((listeners) -> - (screen, buttons) -> { - for (InitScreenCallback listener : listeners) { - listener.initScreen(screen, buttons); - } - } - ); - - void initScreen(Screen screen, List buttons); - - interface Pre { - Event EVENT = Event.create((listeners) -> - (screen) -> { - for (InitScreenCallback.Pre listener : listeners) { - listener.preInitScreen(screen); - } - } - ); - - void preInitScreen(Screen screen); - } -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/KeyboardCallback.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/KeyboardCallback.java deleted file mode 100644 index cf8fe35c..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/KeyboardCallback.java +++ /dev/null @@ -1,45 +0,0 @@ -//#if FABRIC>=1 -package de.johni0702.minecraft.gui.versions.callbacks; - -import de.johni0702.minecraft.gui.utils.Event; - -public interface KeyboardCallback { - Event EVENT = Event.create((listeners) -> - new KeyboardCallback() { - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - for (KeyboardCallback listener : listeners) { - if (listener.keyPressed(keyCode, scanCode, modifiers)) { - return true; - } - } - return false; - } - - @Override - public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - for (KeyboardCallback listener : listeners) { - if (listener.keyReleased(keyCode, scanCode, modifiers)) { - return true; - } - } - return false; - } - - @Override - public boolean charTyped(char charCode, int scanCode) { - for (KeyboardCallback listener : listeners) { - if (listener.charTyped(charCode, scanCode)) { - return true; - } - } - return false; - } - } - ); - - boolean keyPressed(int keyCode, int scanCode, int modifiers); - boolean keyReleased(int keyCode, int scanCode, int modifiers); - boolean charTyped(char keyChar, int scanCode); -} -//#endif diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/MouseCallback.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/MouseCallback.java deleted file mode 100644 index de2415cb..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/MouseCallback.java +++ /dev/null @@ -1,56 +0,0 @@ -//#if FABRIC>=1 -package de.johni0702.minecraft.gui.versions.callbacks; - -import de.johni0702.minecraft.gui.utils.Event; - -public interface MouseCallback { - Event EVENT = Event.create((listeners) -> - new MouseCallback() { - @Override - public boolean mouseDown(double x, double y, int button) { - for (MouseCallback listener : listeners) { - if (listener.mouseDown(x, y, button)) { - return true; - } - } - return false; - } - - @Override - public boolean mouseDrag(double x, double y, int button, double dx, double dy) { - for (MouseCallback listener : listeners) { - if (listener.mouseDrag(x, y, button, dx, dy)) { - return true; - } - } - return false; - } - - @Override - public boolean mouseUp(double x, double y, int button) { - for (MouseCallback listener : listeners) { - if (listener.mouseUp(x, y, button)) { - return true; - } - } - return false; - } - - @Override - public boolean mouseScroll(double x, double y, double scroll) { - for (MouseCallback listener : listeners) { - if (listener.mouseScroll(x, y, scroll)) { - return true; - } - } - return false; - } - } - ); - - boolean mouseDown(double x, double y, int button); - boolean mouseDrag(double x, double y, int button, double dx, double dy); - boolean mouseUp(double x, double y, int button); - boolean mouseScroll(double x, double y, double scroll); -} -//#endif diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/OpenGuiScreenCallback.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/OpenGuiScreenCallback.java deleted file mode 100644 index 3eb1d8c0..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/OpenGuiScreenCallback.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.johni0702.minecraft.gui.versions.callbacks; - -import de.johni0702.minecraft.gui.utils.Event; -import net.minecraft.client.gui.screen.Screen; - -public interface OpenGuiScreenCallback { - Event EVENT = Event.create((listeners) -> - (screen) -> { - for (OpenGuiScreenCallback listener : listeners) { - listener.openGuiScreen(screen); - } - } - ); - - void openGuiScreen(Screen screen); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/PostRenderScreenCallback.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/PostRenderScreenCallback.java deleted file mode 100644 index 20b9f544..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/PostRenderScreenCallback.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.johni0702.minecraft.gui.versions.callbacks; - -import de.johni0702.minecraft.gui.utils.Event; -import net.minecraft.client.util.math.MatrixStack; - -public interface PostRenderScreenCallback { - Event EVENT = Event.create((listeners) -> - (stack, partialTicks) -> { - for (PostRenderScreenCallback listener : listeners) { - listener.postRenderScreen(stack, partialTicks); - } - } - ); - - void postRenderScreen(MatrixStack stack, float partialTicks); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/PreTickCallback.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/PreTickCallback.java deleted file mode 100644 index a3f2df00..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/PreTickCallback.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.johni0702.minecraft.gui.versions.callbacks; - -import de.johni0702.minecraft.gui.utils.Event; - -public interface PreTickCallback { - Event EVENT = Event.create((listeners) -> - () -> { - for (PreTickCallback listener : listeners) { - listener.preTick(); - } - } - ); - - void preTick(); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/RenderHudCallback.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/RenderHudCallback.java deleted file mode 100644 index 14c240a4..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/callbacks/RenderHudCallback.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.johni0702.minecraft.gui.versions.callbacks; - -import de.johni0702.minecraft.gui.utils.Event; -import net.minecraft.client.util.math.MatrixStack; - -public interface RenderHudCallback { - Event EVENT = Event.create((listeners) -> - (stack, partialTicks) -> { - for (RenderHudCallback listener : listeners) { - listener.renderHud(stack, partialTicks); - } - } - ); - - void renderHud(MatrixStack stack, float partialTicks); -} diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/forge/EventsAdapter.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/forge/EventsAdapter.java deleted file mode 100644 index c690defc..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/forge/EventsAdapter.java +++ /dev/null @@ -1 +0,0 @@ -// Forge only diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinGameRenderer.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinGameRenderer.java deleted file mode 100644 index 4edd6ab2..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinGameRenderer.java +++ /dev/null @@ -1,31 +0,0 @@ -//#if FABRIC>=1 -package de.johni0702.minecraft.gui.versions.mixin; - -import de.johni0702.minecraft.gui.versions.callbacks.PostRenderScreenCallback; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.MatrixStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(GameRenderer.class) -public class MixinGameRenderer { - @Inject( - method = "render", - at = @At( - value = "INVOKE", - //#if MC>=11600 - target = "Lnet/minecraft/client/gui/screen/Screen;render(Lnet/minecraft/client/util/math/MatrixStack;IIF)V", - //#else - //$$ target = "Lnet/minecraft/client/gui/screen/Screen;render(IIF)V", - //#endif - shift = At.Shift.AFTER - ) - ) - private void postRenderScreen(float partialTicks, long nanoTime, boolean renderWorld, CallbackInfo ci) { - MatrixStack stack = new MatrixStack(); - PostRenderScreenCallback.EVENT.invoker().postRenderScreen(stack, partialTicks); - } -} -//#endif diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinKeyboardListener.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinKeyboardListener.java deleted file mode 100644 index 5a538c12..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinKeyboardListener.java +++ /dev/null @@ -1,72 +0,0 @@ -//#if FABRIC>=1 -package de.johni0702.minecraft.gui.versions.mixin; - -import de.johni0702.minecraft.gui.versions.callbacks.KeyboardCallback; -import net.minecraft.client.Keyboard; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.ParentElement; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Group; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Keyboard.class) -public class MixinKeyboardListener { - @Inject( - method = "method_1454", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;keyPressed(III)Z"), - cancellable = true - ) - private void keyPressed(int i, boolean[] bls, ParentElement element, int keyCode, int scanCode, int modifiers, CallbackInfo ci) { - if (KeyboardCallback.EVENT.invoker().keyPressed(keyCode, scanCode, modifiers)) { - bls[0] = true; - ci.cancel(); - } - } - - @Inject( - method = "method_1454", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/ParentElement;keyReleased(III)Z"), - cancellable = true - ) - private void keyReleased(int i, boolean[] bls, ParentElement element, int keyCode, int scanCode, int modifiers, CallbackInfo ci) { - if (KeyboardCallback.EVENT.invoker().keyReleased(keyCode, scanCode, modifiers)) { - bls[0] = true; - ci.cancel(); - } - } - - @Inject(method = "method_1458", at = @At("HEAD"), cancellable = true) - @Group(min = 1, max = 1, name = "replaymod-jgui-charTyped-int") - private static void charTyped(Element element, int keyChar, int modifiers, CallbackInfo ci) { - if (KeyboardCallback.EVENT.invoker().charTyped((char) keyChar, modifiers)) { - ci.cancel(); - } - } - - @Inject(method = "lambda$onCharEvent$5", at = @At("HEAD"), cancellable = true, remap = false) - @Group(min = 1, max = 1, name = "replaymod-jgui-charTyped-int") - private void charTypedOptifine(int keyChar, int modifiers, Element element, CallbackInfo ci) { - if (KeyboardCallback.EVENT.invoker().charTyped((char) keyChar, modifiers)) { - ci.cancel(); - } - } - - @Inject(method = "method_1473", at = @At("HEAD"), cancellable = true) - @Group(min = 1, max = 1, name = "replaymod-jgui-charTyped-char") - private static void charTyped(Element element, char keyChar, int modifiers, CallbackInfo ci) { - if (KeyboardCallback.EVENT.invoker().charTyped(keyChar, modifiers)) { - ci.cancel(); - } - } - - @Inject(method = "lambda$onCharEvent$6", at = @At("HEAD"), cancellable = true, remap = false) - @Group(min = 1, max = 1, name = "replaymod-jgui-charTyped-char") - private void charTypedOptifine(char keyChar, int modifiers, Element element, CallbackInfo ci) { - if (KeyboardCallback.EVENT.invoker().charTyped(keyChar, modifiers)) { - ci.cancel(); - } - } -} -//#endif diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinMinecraft.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinMinecraft.java deleted file mode 100644 index 80cf9110..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinMinecraft.java +++ /dev/null @@ -1,26 +0,0 @@ -// Note: this will also work in 1.13 but we don't really support 1.13 and MixinGradle is yet to be updated -//#if FABRIC>=1 -package de.johni0702.minecraft.gui.versions.mixin; - -import de.johni0702.minecraft.gui.versions.callbacks.OpenGuiScreenCallback; -import de.johni0702.minecraft.gui.versions.callbacks.PreTickCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(MinecraftClient.class) -public abstract class MixinMinecraft { - @Inject(method = "tick", at = @At("HEAD")) - private void preTick(CallbackInfo ci) { - PreTickCallback.EVENT.invoker().preTick(); - } - - @Inject(method = "openScreen", at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;")) - private void openGuiScreen(Screen newGuiScreen, CallbackInfo ci) { - OpenGuiScreenCallback.EVENT.invoker().openGuiScreen(newGuiScreen); - } -} -//#endif diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinMouseListener.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinMouseListener.java deleted file mode 100644 index b695872d..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinMouseListener.java +++ /dev/null @@ -1,55 +0,0 @@ -//#if MC>11202 -package de.johni0702.minecraft.gui.versions.mixin; - -import de.johni0702.minecraft.gui.versions.callbacks.MouseCallback; -import net.minecraft.client.Mouse; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.screen.Screen; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Mouse.class) -public abstract class MixinMouseListener { - @Accessor // Note: for some reason Mixin doesn't include this in the refmap json if it's just a @Shadow field - abstract int getActiveButton(); - - @Inject(method = "method_1611", at = @At("HEAD"), cancellable = true) - private void mouseDown(boolean[] result, double x, double y, int button, CallbackInfo ci) { - if (MouseCallback.EVENT.invoker().mouseDown(x, y, button)) { - result[0] = true; - ci.cancel(); - } - } - - @Inject(method = "method_1605", at = @At("HEAD"), cancellable = true) - private void mouseUp(boolean[] result, double x, double y, int button, CallbackInfo ci) { - if (MouseCallback.EVENT.invoker().mouseUp(x, y, button)) { - result[0] = true; - ci.cancel(); - } - } - - @Inject(method = "method_1602", at = @At("HEAD"), cancellable = true) - private void mouseDrag(Element element, double x, double y, double dx, double dy, CallbackInfo ci) { - if (MouseCallback.EVENT.invoker().mouseDrag(x, y, getActiveButton(), dx, dy)) { - ci.cancel(); - } - } - - @Redirect( - method = "onMouseScroll", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseScrolled(DDD)Z") - ) - private boolean mouseScroll(Screen element, double x, double y, double scroll) { - if (MouseCallback.EVENT.invoker().mouseScroll(x, y, scroll)) { - return true; - } else { - return element.mouseScrolled(x, y, scroll); - } - } -} -//#endif diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinScreen.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinScreen.java deleted file mode 100644 index 6855bf38..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/MixinScreen.java +++ /dev/null @@ -1,32 +0,0 @@ -//#if FABRIC>=1 -package de.johni0702.minecraft.gui.versions.mixin; - -import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.AbstractButtonWidget; -import org.spongepowered.asm.mixin.Final; -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; - -@Mixin(Screen.class) -public class MixinScreen { - @Shadow - protected @Final List buttons; - - @Inject(method = "init(Lnet/minecraft/client/MinecraftClient;II)V", at = @At("HEAD")) - private void preInit(MinecraftClient minecraftClient_1, int int_1, int int_2, CallbackInfo ci) { - InitScreenCallback.Pre.EVENT.invoker().preInitScreen((Screen) (Object) this); - } - - @Inject(method = "init(Lnet/minecraft/client/MinecraftClient;II)V", at = @At("RETURN")) - private void init(MinecraftClient minecraftClient_1, int int_1, int int_2, CallbackInfo ci) { - InitScreenCallback.EVENT.invoker().initScreen((Screen) (Object) this, buttons); - } -} -//#endif diff --git a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/Mixin_RenderHudCallback.java b/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/Mixin_RenderHudCallback.java deleted file mode 100644 index d223f960..00000000 --- a/jGui/src/main/java/de/johni0702/minecraft/gui/versions/mixin/Mixin_RenderHudCallback.java +++ /dev/null @@ -1,33 +0,0 @@ -//#if FABRIC>=1 -package de.johni0702.minecraft.gui.versions.mixin; - -import de.johni0702.minecraft.gui.versions.callbacks.RenderHudCallback; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.MatrixStack; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(InGameHud.class) -public class Mixin_RenderHudCallback { - @Inject( - method = "render", - at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/client/options/GameOptions;debugEnabled:Z" - ) - ) - //#if MC>=11600 - private void renderOverlay(MatrixStack stack, float partialTicks, CallbackInfo ci) { - //#else - //$$ private void renderOverlay(float partialTicks, CallbackInfo ci) { - //$$ MatrixStack stack = new MatrixStack(); - //#endif - RenderHudCallback.EVENT.invoker().renderHud(stack, partialTicks); - } -} -//#endif diff --git a/jGui/src/main/resources/assets/jgui/gui.png b/jGui/src/main/resources/assets/jgui/gui.png deleted file mode 100644 index 64138c69d6850910dac05b338722ac172c582dab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4230 zcmeHL={pn*_Z~|;_BFea=^-Rb#MsN@K_Z?>q-@z0%`li5F}CbmB2BVpOJvCwh9Q|D z%;Y6YlQ9}uvd`Gf@b+BqKk@tUJLfvreXjdDU(WsI+}BBUxM?N8E5i!_00gdETR;E+ zw%;uq;190f;2QeI?>BIH-LSF%oc^1o-PO6j86KFm3mgF86Z^N=00o6oze(<}>vn&0 z&++mLg0#m~25$iX!eZAgt~nyVtI|1`BuV(7TxEm2)#$PaPjy~(zx=j#4Uik(DyP!p-< zR`{xWr=+I4RB!E+2V>#L0AM$+Mba5J{*RtKz*KkQGQ38{(PQS$a65{i+%|D}JJK0N zufR>UjhruAdDHjiIC1())QcJ4k62;rry!!iNKmvH`BFFzw~7;ABy+5bCGR`$9}Q`X z!tqnqyD!a74@t}o1P%^}=mqxFlc~ZeA&c0#)06#d;1=*fH1kPdVW0vhl&GVvXSSU9 zYNBx=!$s-fYR%80_2_YjrDGlyyfsleHV-uX3^(=AEat?u1p5b-ZLg~5)xFnT<6bXY$xxK54!+hH*1*tp{CYfz|Y^=1&#~r-M zuB^MR$Q7fp$p*27MvwP3@Zim?byvNM4KyX8^b=Y?7!r!QC+e^@eEb3cv8kA*_Ot#0 zKj{MSt%PiC5JCjr&TlO@K`tMHzTjEb^JwZzU&sg9*rKkkZdb1Dn(PozB}{NFaxBKM z2M3vRyT0RQh5YNs2Wzg=N;5tbbP{l~Q*E}*JcO&uYEZCc3!9j%xRU^l=qw*@BIO9A zx~o2XbuNN`{J}lkShJz)=n+73qhEjZVDd*5EzdObg*3GwkCHk2T}Yxp&&%S;j9uUbg?_-Mds- zm=I%Uis+krbT|43=tbEvGN0*wqEINveFC`!Ks8hW0Jy_ZC}rkNpl7k7h05W2uub$a z?erB|gWS(ras^iLi`4ZTHvU{`1p+7eMNU|ACx6ATz2*dL_312+8w!9k@Kx~G^8x5eJtlas<&f}9igUyo;8I~T;Srf`141!ql9ZE zlOE7<%RM+M43{F>`%{QmV&!$}8IwVn4{_}B@VA$gMcyPGHXU^Y2?;Z6WWZd^fgh!W zG5yt#wD;;y7B-bqO*`}{ny)!w+6`RD)>kCoaFgd0qF6sGM~BN^_It>9tO>}2Z`|2#z^DDQo$ zLY;4Fq7HvAd+Ye~taz!wMil#(z*)rs3;M&aFp4&^P!0LL{P=GQ;v0AAv#XA5DTBu< z?96p&3eoLH z0~1TcXkbzE(!9{kx!=rt^(DgmhHLyd&CJs5#d=r0QN67Cs!N8dww+j|IK)PMn2z_@ zSzJsalkWjcPY%3$j(%N?KKdhyMx&7BCBe=4ar@KVDd-Jx z(54&v!H;xJqBHx^viC9wESD_ZCZES1{R*5Ry?Igfqgh0jP=kD>;{!GYIlBj#r8CW+ z>1E~io_=c=2vv#qwd(Z+;KV1(Drfd`w|740Fpdmg2^LH@<|VpvP|o1By-DYicEj_B z0=#|N(zso9>*5hw#0b|JSWBN+{C24G%%3F3Ow%Wi{l(I-BxYb1TCJm9zyha{0hO^D zH~hwF>URWO48qhhhsSq$O;u4*clM7J@GrfdPs@-c@I!+G+diu>%Jd_7crlNNptlky z?J&I5CuJ;0RGcBV_>vW%eq&yXh>=#5sgy}h_$U5+7uKEG@BG@M#O&smR!^>>z6dfz zf{?5qXSa!r7>B9+EL^k517w};^=o!nqMU`$KLEOFE(_u@7b|7P9cOfTYx6u}npooj2WlN+=d z%nl%?hez{b`0ltZ4QtmM?Zh)aEh9}X=?41@;Ws=nj00-TK%9XW3@JISn}c#0rvEx8 zc|H=CzYUa7bK+?I_^d2AlXqbtKsMQzLjfkp?;T;Onu^kM)v`&Na7-Gw^EL!N`xI2M zF#RXtQNi*(g0A^o|09oWA|{)hq^XHerc*A&<|f*dYS}+unv$m&#Us}C&dM2gXB{+d zEhvkA-)2U?LWRG<^gX*s)Wl*(^ITQV7|u~mkega^M1!cf`^5pW_9?3x-Aev@&GXo5 zajPcVw5(-$`vy50I8L8GCD0BWy%Xlvj~;0m8$$>#fnF`ZI147>Qd6J41dH0ykqzrY zAgC>1oU>AfrQA4?diP@cUjth16enXm+PP!)cISf1%mLvd?d`5@^Y%JX3U8B2`?gLpWo@zar*E;uE(--)X-N&N~70G zAtLX6JvI2Xx5o1`NHlFbAH#>as4M7hrxU$;y{~zJhW2xoUP|>%stQN)KREX-a;G#C zf4hCGT7#~|RwyxGspIv;PHb8??&>Ekc8A*j#4{K1>z+s)Fqfo9i{D;LEf1XRJ^uAv z`(~ou(qL}&L%Cb^6|}EWi^ep5_w2U(!(K;aNZ3S2z5kIxN{<&fYOqCwzA$*^ZtsYQ zxz(KcR0Cf$nbM>l&dN$y4ndndYbwdOYwSIT7B6jWtff6kzdXrGb>>sZ5zxdSR!R|E+!9wQr6dc#6vcY`AI=YyJxnde0J0Tigi*G#F7^bT zhrws-WDz6C_rWvkd^E=)-=g9t3&?OSclpbj2<`}O@LE}F@##rt{hVS-(<|Pt5WlX# z715w}L0d*ljulVo=HpHcNMTNTlZP5AUhk?Z9$oU%5{BHetjU5R_@u3_a65*Mf*BQm ztUqs>1*>1BaX8DjxOrmy8h0INX!Q(^uy@;|!{$NfG@ti3YGrDXvZju0hgPeK*YRUl zL>OCrt>;NuwR-f0Z?}Tou0GN_64c!?FUst(jkbsqU=sTC<&rHg ztUKHlkrkArZ+|JN30Ms8L$>O7Mwl2Mgvp{z9JTt5mJLb6ZoatMwSCLgDRhCjN(aQo zSI(vV5QtzC%H3WIq>{;>v3cI%!f*O8c$+k!WTvKv%s3=vK-*`!g{m^q=_KE0^!D9j zY10q%JK^GL{jSzuo6PEPTPshie;??vd045FwOv2hXb-NWB&Ax%M}H3Sl*`PMV=SwF zJ)nQJtU#c zH(y%tdy%t7!t9(v9THxN+eiz~7%d4;ceO6J%FRi&b5rs1)%<6Xk*(;l!O_u7Q&f)r zJGKm(d9LUy<)_WwbkFhw}Q})qNtl<*7ipAQW#*Y6%`5uMN+2 zXxyy;`U7iWUr~?rioZC~-#?lSN68P#XWfsjrRZd62|h32hph6y6~JPzJlI|13NT8BC&3@iIfY+y$Z1!OmAYS`tY>079LZ!Y;+sa!ZkFcRK;2_ zIg;djsx=7}*yrbSbwe#mLpT_r)ZGA1956wls+HN^sqtNaarM%du&mj};)CWn*#_?Z zx85&Z^l2YbHG7B)zC~T_JVz93feK+QBZtud&`7ht6!(K782GKUHma@rf_GSEf1$UW zWPVW8!6%wAf5)?^KP?Gp=a)AdE`bnJ9LT*j=@RtON&{|{hrFKe>q7LOn59tY=^o7Z z`%=WXuezg%;*kBnjtyG5iR0;kcM)ptSnvMxy!6^;me<-HWP9|Fa+3{2X&p zjM2Ml3JpCRg&e*v`H!8q3`&eA_L;2B7&F8joB5-og8un`9og3BYps)y{TXgOg1s+1 z&?q$Vuj-0(piZ@|mD8&h77HvOYt2ZFW4|;rg()`)0O;KFCL0h|_PUpGALb1FZP-C( z!6)~(Vmt_Y-)^6$i!}f?&YXIj9!)(yH4W=LZ6=x0a_vp$2ht_qa$2B&ob5GAaJR6q zK>L0FDNc1{WBzi+g~l8XdjLl_H8)S!nn?iU_K!0K>?utCDgfv;=Q)tg{{RFsGc)8p z_gb}A2+oTZISfpXg%f8kltj_Htx~MZLLa{C@#~{OK+L diff --git a/jGui/src/main/resources/mixins.jgui.json b/jGui/src/main/resources/mixins.jgui.json deleted file mode 100644 index 41d82dd7..00000000 --- a/jGui/src/main/resources/mixins.jgui.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "required": true, - "package": "de.johni0702.minecraft.gui.versions.mixin", - "mixins": [], - "server": [], - "client": [ - //#if MC>=11400 - //#if MC>=11400 - "Mixin_RenderHudCallback", - "MixinGameRenderer", - "MixinScreen", - "MixinMouseListener", - "MixinKeyboardListener", - // Note: MixinMinecraft actually belongs one line down in the 1.13 part but see its source file for why it isn't - "MixinMinecraft" - //#endif - //#endif - ], - "compatibilityLevel": "JAVA_8", - "minVersion": "0.6.11", - "refmap": "mixins.jgui.refmap.json" -} \ No newline at end of file diff --git a/jGui/versions/1.12/mapping.txt b/jGui/versions/1.12/mapping.txt deleted file mode 100644 index 1944baba..00000000 --- a/jGui/versions/1.12/mapping.txt +++ /dev/null @@ -1 +0,0 @@ -net.minecraft.client.renderer.BufferBuilder net.minecraft.client.renderer.VertexBuffer \ No newline at end of file diff --git a/jGui/versions/1.12/src/main/java/de/johni0702/minecraft/gui/versions/Image.java b/jGui/versions/1.12/src/main/java/de/johni0702/minecraft/gui/versions/Image.java deleted file mode 100644 index e057c377..00000000 --- a/jGui/versions/1.12/src/main/java/de/johni0702/minecraft/gui/versions/Image.java +++ /dev/null @@ -1,85 +0,0 @@ -package de.johni0702.minecraft.gui.versions; - -import net.minecraft.client.renderer.texture.DynamicTexture; - -import javax.imageio.ImageIO; -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Path; - -public class Image implements AutoCloseable { - private BufferedImage inner; - - public Image(int width, int height) { - this(new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)); - } - - public Image(BufferedImage inner) { - this.inner = inner; - } - - public BufferedImage getInner() { - return inner; - } - - @Override - public void close() { - if (inner != null) { - inner = null; - } - } - - public int getWidth() { - return inner.getWidth(); - } - - public int getHeight() { - return inner.getHeight(); - } - - public void setRGBA(int x, int y, int r, int g, int b, int a) { - inner.setRGB(x, y, ((a & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)); - } - - public static Image read(Path path) throws IOException { - return read(Files.newInputStream(path)); - } - - public static Image read(InputStream in) throws IOException { - BufferedImage image = ImageIO.read(in); - if (image == null) { - throw new IOException("Cannot read image: ImageIO.read returned null"); - } - return new Image(image); - } - - public void writePNG(File file) throws IOException { - ImageIO.write(inner, "PNG", file); - } - - public void writePNG(OutputStream outputStream) throws IOException { - ImageIO.write(inner, "PNG", outputStream); - } - - public Image scaledSubRect(int x, int y, int width, int height, int scaledWidth, int scaledHeight) { - BufferedImage dst = new BufferedImage(scaledWidth, scaledHeight, inner.getType()); - Graphics2D graphics = dst.createGraphics(); - graphics.drawImage(inner, 0, 0, scaledWidth, scaledHeight, - x, y, x + width, y + height, null); - graphics.dispose(); - return new Image(dst); - } - - public BufferedImage toBufferedImage() { - return inner; - } - - public DynamicTexture toTexture() { - return new DynamicTexture(inner); - } -} diff --git a/jGui/versions/1.12/src/main/java/de/johni0702/minecraft/gui/versions/forge/EventsAdapter.java b/jGui/versions/1.12/src/main/java/de/johni0702/minecraft/gui/versions/forge/EventsAdapter.java deleted file mode 100644 index 00f1678a..00000000 --- a/jGui/versions/1.12/src/main/java/de/johni0702/minecraft/gui/versions/forge/EventsAdapter.java +++ /dev/null @@ -1,93 +0,0 @@ -package de.johni0702.minecraft.gui.versions.forge; - -import de.johni0702.minecraft.gui.utils.EventRegistrations; -import de.johni0702.minecraft.gui.versions.MatrixStack; -import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback; -import de.johni0702.minecraft.gui.versions.callbacks.OpenGuiScreenCallback; -import de.johni0702.minecraft.gui.versions.callbacks.PostRenderScreenCallback; -import de.johni0702.minecraft.gui.versions.callbacks.PreTickCallback; -import de.johni0702.minecraft.gui.versions.callbacks.RenderHudCallback; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.client.event.GuiOpenEvent; -import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; - -import java.util.List; - -public class EventsAdapter extends EventRegistrations { - public static GuiScreen getScreen(GuiScreenEvent event) { - //#if MC>=10904 - return event.getGui(); - //#else - //$$ return event.gui; - //#endif - } - - public static List getButtonList(GuiScreenEvent.InitGuiEvent event) { - //#if MC>=10904 - return event.getButtonList(); - //#else - //$$ return event.buttonList; - //#endif - } - - @SubscribeEvent - public void preGuiInit(GuiScreenEvent.InitGuiEvent.Pre event) { - InitScreenCallback.Pre.EVENT.invoker().preInitScreen(getScreen(event)); - } - - @SubscribeEvent - public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) { - InitScreenCallback.EVENT.invoker().initScreen(getScreen(event), getButtonList(event)); - } - - @SubscribeEvent(priority = EventPriority.LOWEST) - public void onGuiClosed(GuiOpenEvent event) { - OpenGuiScreenCallback.EVENT.invoker().openGuiScreen( - //#if MC>=10904 - event.getGui() - //#else - //$$ event.gui - //#endif - ); - } - - public static float getPartialTicks(RenderGameOverlayEvent event) { - //#if MC>=10904 - return event.getPartialTicks(); - //#else - //$$ return event.partialTicks; - //#endif - } - - public static float getPartialTicks(GuiScreenEvent.DrawScreenEvent.Post event) { - //#if MC>=10904 - return event.getRenderPartialTicks(); - //#else - //$$ return event.renderPartialTicks; - //#endif - } - - @SubscribeEvent - public void onGuiRender(GuiScreenEvent.DrawScreenEvent.Post event) { - PostRenderScreenCallback.EVENT.invoker().postRenderScreen(new MatrixStack(), getPartialTicks(event)); - } - - // Even when event was cancelled cause Lunatrius' InGame-Info-XML mod cancels it and we don't actually care about - // the event (i.e. the overlay text), just about when it's called. - @SubscribeEvent(receiveCanceled = true) - public void renderOverlay(RenderGameOverlayEvent.Text event) { - RenderHudCallback.EVENT.invoker().renderHud(new MatrixStack(), getPartialTicks(event)); - } - - @SubscribeEvent - public void tickOverlay(TickEvent.ClientTickEvent event) { - if (event.phase == TickEvent.Phase.START) { - PreTickCallback.EVENT.invoker().preTick(); - } - } -} diff --git a/jGui/versions/1.14.4-forge/mapping.txt b/jGui/versions/1.14.4-forge/mapping.txt deleted file mode 100644 index fa5e781a..00000000 --- a/jGui/versions/1.14.4-forge/mapping.txt +++ /dev/null @@ -1,30 +0,0 @@ -net.minecraft.crash.ReportedException net.minecraft.util.ReportedException -net.minecraftforge.eventbus.api.EventPriority net.minecraftforge.fml.common.eventhandler.EventPriority -net.minecraftforge.eventbus.api.SubscribeEvent net.minecraftforge.fml.common.eventhandler.SubscribeEvent -net.minecraftforge.event.TickEvent net.minecraftforge.fml.common.gameevent.TickEvent -com.mojang.blaze3d.platform.GlStateManager net.minecraft.client.renderer.GlStateManager -com.mojang.blaze3d.platform.GlStateManager disableTexture() disableTexture2D() -com.mojang.blaze3d.platform.GlStateManager enableTexture() enableTexture2D() -com.mojang.blaze3d.platform.GlStateManager disableColorLogicOp() disableColorLogic() -com.mojang.blaze3d.platform.GlStateManager enableColorLogicOp() enableColorLogic() -com.mojang.blaze3d.platform.GlStateManager logicOp() colorLogicOp() -com.mojang.blaze3d.platform.GlStateManager color4f() color() -com.mojang.blaze3d.platform.GlStateManager disableAlphaTest() disableAlpha() -com.mojang.blaze3d.platform.GlStateManager enableAlphaTest() enableAlpha() -com.mojang.blaze3d.platform.GlStateManager blendFuncSeparate() tryBlendFuncSeparate() -net.minecraft.util.SoundEvents net.minecraft.init.SoundEvents -net.minecraft.client.gui.screen.Screen net.minecraft.client.gui.GuiScreen -net.minecraft.client.gui.screen.Screen hasControlDown() isCtrlKeyDown() -net.minecraft.client.gui.screen.Screen hasShiftDown() isShiftKeyDown() -net.minecraft.client.gui.screen.Screen init() setWorldAndResolution() -net.minecraft.client.gui.screen.Screen renderBackground() drawDefaultBackground() -net.minecraft.client.gui.screen.Screen renderDirtBackground() drawBackground() -net.minecraft.client.gui.screen.Screen removed() onGuiClosed() -net.minecraft.client.gui.screen.Screen render() drawScreen() -net.minecraft.client.gui.screen.Screen minecraft mc -net.minecraft.client.gui.screen.Screen passEvents allowUserInput -net.minecraft.client.gui.AbstractGui net.minecraft.client.gui.Gui -net.minecraft.client.gui.AbstractGui fill() drawRect() -# Note: GuiButton has been split into Button and Widget (now shared with e.g. checkboxes), -# most members are actually on the latter (there's also AbstractButton in the middle, but it isn't interesting) -net.minecraft.client.gui.widget.Widget net.minecraft.client.gui.GuiButton diff --git a/jGui/versions/1.14.4/src/main/java/de/johni0702/minecraft/gui/versions/MatrixStack.java b/jGui/versions/1.14.4/src/main/java/de/johni0702/minecraft/gui/versions/MatrixStack.java deleted file mode 100644 index 2d31a201..00000000 --- a/jGui/versions/1.14.4/src/main/java/de/johni0702/minecraft/gui/versions/MatrixStack.java +++ /dev/null @@ -1,4 +0,0 @@ -package de.johni0702.minecraft.gui.versions; - -public class MatrixStack { -} diff --git a/jGui/versions/1.8/mapping.txt b/jGui/versions/1.8/mapping.txt deleted file mode 100644 index 82b0a875..00000000 --- a/jGui/versions/1.8/mapping.txt +++ /dev/null @@ -1,4 +0,0 @@ -net.minecraftforge.fml.common.gameevent.TickEvent cpw.mods.fml.common.gameevent.TickEvent -net.minecraftforge.fml.common.eventhandler.EventPriority cpw.mods.fml.common.eventhandler.EventPriority -net.minecraftforge.fml.common.eventhandler.SubscribeEvent cpw.mods.fml.common.eventhandler.SubscribeEvent -net.minecraftforge.fml.common.FMLCommonHandler cpw.mods.fml.common.FMLCommonHandler \ No newline at end of file diff --git a/jGui/versions/1.9.4/mapping.txt b/jGui/versions/1.9.4/mapping.txt deleted file mode 100644 index c4b7de78..00000000 --- a/jGui/versions/1.9.4/mapping.txt +++ /dev/null @@ -1 +0,0 @@ -net.minecraft.client.renderer.VertexBuffer net.minecraft.client.renderer.WorldRenderer diff --git a/jGui/versions/mainProject b/jGui/versions/mainProject deleted file mode 100644 index 709c55fe..00000000 --- a/jGui/versions/mainProject +++ /dev/null @@ -1 +0,0 @@ -1.16.4 \ No newline at end of file diff --git a/jGui/versions/mapping-1.16.4-fabric-forge.txt b/jGui/versions/mapping-1.16.4-fabric-forge.txt deleted file mode 100644 index 42a13a23..00000000 --- a/jGui/versions/mapping-1.16.4-fabric-forge.txt +++ /dev/null @@ -1,4 +0,0 @@ -net.minecraft.util.Identifier net.minecraft.util.ResourceLocation - -net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket getChannel() getChannelName() -net.minecraft.network.play.server.SCustomPayloadPlayPacket getChannel() getChannelName() diff --git a/jGui/versions/mapping-fabric-1.15.2-1.14.4.txt b/jGui/versions/mapping-fabric-1.15.2-1.14.4.txt deleted file mode 100644 index 044be4df..00000000 --- a/jGui/versions/mapping-fabric-1.15.2-1.14.4.txt +++ /dev/null @@ -1 +0,0 @@ -net.minecraft.client.util.math.MatrixStack de.johni0702.minecraft.gui.versions.MatrixStack From ccb6aab22fd5e382bec3b221b3dcaeaa0b9efb38 Mon Sep 17 00:00:00 2001 From: Yuji Ueki Date: Sun, 31 Jan 2021 22:27:04 +0900 Subject: [PATCH 5/5] :shirt: Reformat code --- .../com/replaymod/compat/ReplayModCompat.java | 21 +- .../compat/optifine/DisableFastRender.java | 12 +- .../compat/shaders/ShaderBeginRender.java | 12 +- .../compat/shaders/ShaderReflection.java | 7 - .../core/DummyChainLoadEntryPoint.java | 18 - .../replaymod/core/KeyBindingRegistry.java | 57 +-- .../core/MinecraftMethodAccessor.java | 12 +- src/main/java/com/replaymod/core/Module.java | 11 +- .../java/com/replaymod/core/ReplayMod.java | 51 +-- .../com/replaymod/core/ReplayModBackend.java | 14 - .../replaymod/core/ReplayModMMLauncher.java | 74 ---- .../core/ReplayModMixinConfigPlugin.java | 20 +- .../core/ReplayModNonMMLauncher.java | 62 --- .../com/replaymod/core/SettingsRegistry.java | 3 + .../core/SettingsRegistryBackend.java | 14 +- .../core/events/KeyEventCallback.java | 5 - .../core/events/PostRenderWorldCallback.java | 2 +- .../core/gui/GuiBackgroundProcesses.java | 10 +- .../replaymod/core/gui/GuiReplaySettings.java | 3 +- .../replaymod/core/gui/ModMenuApiImpl.java | 21 - .../replaymod/core/gui/RestoreReplayGui.java | 17 +- .../core/tweaker/ReplayModTweaker.java | 19 +- .../com/replaymod/core/utils/ModCompat.java | 1 + .../replaymod/core/utils/ModInfoGetter.java | 10 +- .../replaymod/core/utils/Restrictions.java | 18 +- .../java/com/replaymod/core/utils/Utils.java | 60 +-- .../replaymod/core/utils/WrappedTimer.java | 35 +- .../core/versions/LangResourcePack.java | 69 +-- .../com/replaymod/core/versions/MCVer.java | 305 +------------ .../com/replaymod/core/versions/Patterns.java | 209 +-------- .../versions/scheduler/SchedulerImpl.java | 4 +- .../com/replaymod/editor/ReplayModEditor.java | 5 +- .../replaymod/editor/gui/GuiEditReplay.java | 6 +- .../replaymod/editor/gui/MarkerProcessor.java | 21 +- .../replaymod/editor/handler/GuiHandler.java | 13 +- .../com/replaymod/extras/FullBrightness.java | 37 +- .../com/replaymod/extras/HotkeyButtons.java | 95 ++-- .../java/com/replaymod/extras/QuickMode.java | 6 +- .../com/replaymod/extras/ReplayModExtras.java | 11 +- .../java/com/replaymod/extras/Setting.java | 1 + .../AdvancedScreenshots.java | 7 +- .../GuiCreateScreenshot.java | 9 +- .../GuiUploadScreenshot.java | 2 +- .../ScreenshotRenderer.java | 2 +- .../advancedscreenshots/ScreenshotWriter.java | 2 +- .../extras/modcore/ModCoreInstaller.java | 29 +- .../extras/playeroverview/PlayerOverview.java | 59 +-- .../playeroverview/PlayerOverviewGui.java | 58 +-- .../extras/youtube/GuiYoutubeUpload.java | 16 +- .../extras/youtube/YoutubeUpload.java | 12 +- .../extras/youtube/YoutubeUploader.java | 2 +- .../java/com/replaymod/gui/GuiRenderer.java | 9 +- .../replaymod/gui/MinecraftGuiRenderer.java | 67 +-- .../com/replaymod/gui/OffsetGuiRenderer.java | 13 +- .../AbstractGuiClickableContainer.java | 4 +- .../gui/container/AbstractGuiContainer.java | 10 +- .../gui/container/AbstractGuiOverlay.java | 118 +---- .../gui/container/AbstractGuiScreen.java | 119 +---- .../gui/container/AbstractGuiScrollable.java | 12 +- .../container/AbstractGuiVerticalList.java | 11 +- .../replaymod/gui/container/GuiContainer.java | 13 +- .../com/replaymod/gui/container/GuiPanel.java | 4 +- .../gui/container/VanillaGuiScreen.java | 173 ++------ .../gui/element/AbstractGuiButton.java | 36 +- .../gui/element/AbstractGuiCheckbox.java | 4 +- .../gui/element/AbstractGuiElement.java | 2 +- .../gui/element/AbstractGuiImage.java | 6 +- .../gui/element/AbstractGuiLabel.java | 16 +- .../gui/element/AbstractGuiTextField.java | 29 +- .../element/AbstractGuiTexturedButton.java | 23 +- .../gui/element/AbstractGuiToggleButton.java | 2 +- .../gui/element/AbstractGuiTooltip.java | 6 +- .../gui/element/ComposedGuiElement.java | 7 +- .../com/replaymod/gui/element/GuiElement.java | 8 + .../com/replaymod/gui/element/IGuiButton.java | 14 +- .../replaymod/gui/element/IGuiClickable.java | 1 + .../gui/element/IGuiHorizontalScrollbar.java | 5 + .../com/replaymod/gui/element/IGuiImage.java | 6 + .../gui/element/IGuiNumberField.java | 9 + .../com/replaymod/gui/element/IGuiSlider.java | 3 + .../replaymod/gui/element/IGuiTextField.java | 58 ++- .../gui/element/IGuiTexturedButton.java | 19 +- .../advanced/AbstractGuiColorPicker.java | 13 +- .../advanced/AbstractGuiDropdownMenu.java | 27 +- .../advanced/AbstractGuiProgressBar.java | 6 +- .../AbstractGuiResourceLoadingList.java | 9 +- .../element/advanced/AbstractGuiTextArea.java | 27 +- .../element/advanced/AbstractGuiTimeline.java | 24 +- .../advanced/AbstractGuiTimelineTime.java | 6 +- .../advanced/GuiResourceLoadingList.java | 2 +- .../element/advanced/IGuiDropdownMenu.java | 2 + .../gui/element/advanced/IGuiTextArea.java | 2 + .../gui/element/advanced/IGuiTimeline.java | 14 + .../element/advanced/IGuiTimelineTime.java | 2 + .../com/replaymod/gui/function/Draggable.java | 1 + .../com/replaymod/gui/function/Focusable.java | 3 + .../replaymod/gui/function/Scrollable.java | 5 +- .../com/replaymod/gui/layout/GridLayout.java | 14 +- .../gui/layout/HorizontalLayout.java | 2 +- .../replaymod/gui/layout/VerticalLayout.java | 2 +- .../replaymod/gui/popup/AbstractGuiPopup.java | 2 +- .../gui/popup/GuiFileChooserPopup.java | 15 +- .../com/replaymod/gui/popup/GuiInfoPopup.java | 12 +- .../replaymod/gui/popup/GuiYesNoPopup.java | 18 +- .../gui/utils/EventRegistrations.java | 22 +- .../com/replaymod/gui/utils/MouseUtils.java | 21 +- .../com/replaymod/gui/utils/StringUtils.java | 8 +- .../java/com/replaymod/gui/utils/Utils.java | 1 + .../com/replaymod/gui/versions/Image.java | 13 +- .../com/replaymod/gui/versions/MCVer.java | 124 +----- .../versions/callbacks/KeyboardCallback.java | 2 + .../gui/versions/callbacks/MouseCallback.java | 3 + .../callbacks/PostRenderScreenCallback.java | 2 +- .../versions/callbacks/RenderHudCallback.java | 2 +- .../gui/versions/forge/EventsAdapter.java | 20 - .../mixin/AbstractButtonWidgetAccessor.java | 2 - ...ntainerLocalRenderInformationAccessor.java | 30 -- .../com/replaymod/mixin/EntityAccessor.java | 23 - .../mixin/EntityLivingBaseAccessor.java | 11 +- .../mixin/EntityOtherPlayerMPAccessor.java | 21 - .../replaymod/mixin/EntityPlayerAccessor.java | 12 +- .../mixin/FirstPersonRendererAccessor.java | 16 +- .../replaymod/mixin/GuiMainMenuAccessor.java | 3 +- .../replaymod/mixin/GuiScreenAccessor.java | 19 +- .../mixin/IntegratedServerAccessor.java | 4 - .../replaymod/mixin/ItemRendererAccessor.java | 2 - .../replaymod/mixin/KeyBindingAccessor.java | 1 + .../replaymod/mixin/MainWindowAccessor.java | 3 + .../replaymod/mixin/MinecraftAccessor.java | 31 +- .../java/com/replaymod/mixin/MixinCamera.java | 9 +- .../replaymod/mixin/MixinChunkVisibility.java | 2 - .../mixin/MixinClientPlayNetHandler.java | 5 +- .../mixin/MixinDownloadingPackFinder.java | 38 +- .../mixin/MixinFMLHandshakeHandler.java | 11 +- .../replaymod/mixin/MixinGameRenderer.java | 11 +- .../replaymod/mixin/MixinGlStateManager.java | 7 +- .../replaymod/mixin/MixinGuiSpectator.java | 12 +- .../com/replaymod/mixin/MixinInGameHud.java | 2 - .../com/replaymod/mixin/MixinMinecraft.java | 86 +--- .../replaymod/mixin/MixinModelRenderer.java | 72 --- .../java/com/replaymod/mixin/MixinMouse.java | 4 - .../com/replaymod/mixin/MixinMouseHelper.java | 6 - .../replaymod/mixin/MixinMouseListener.java | 55 --- .../mixin/MixinNetHandlerLoginClient.java | 7 +- .../mixin/MixinNetHandlerPlayClient.java | 51 +-- .../replaymod/mixin/MixinParticleManager.java | 86 +--- .../java/com/replaymod/mixin/MixinRender.java | 27 +- .../com/replaymod/mixin/MixinRenderArrow.java | 15 +- .../replaymod/mixin/MixinRenderGlobal.java | 17 +- .../com/replaymod/mixin/MixinRenderItem.java | 48 +- .../mixin/MixinRenderLivingBase.java | 29 +- .../replaymod/mixin/MixinRenderManager.java | 49 +-- .../java/com/replaymod/mixin/MixinScreen.java | 3 +- .../mixin/MixinShaderEntityRenderer.java | 10 - .../mixin/MixinShaderRenderChunk.java | 33 +- .../replaymod/mixin/MixinShadersRender.java | 30 +- .../MixinTileEntityEndPortalRenderer.java | 35 +- .../MixinTileEntityRendererDispatcher.java | 70 --- .../com/replaymod/mixin/MixinViewFrustum.java | 32 +- .../com/replaymod/mixin/MixinWorldClient.java | 87 +--- .../mixin/Mixin_BlockOnChunkRebuilds.java | 20 +- .../mixin/Mixin_ChromaKeyColorSky.java | 10 +- .../mixin/Mixin_ChromaKeyDisableFog.java | 5 +- .../mixin/Mixin_ChromaKeyForceSky.java | 23 +- .../mixin/Mixin_ChunkRenderWorker.java | 44 -- .../mixin/Mixin_ContextualKeyBindings.java | 28 +- .../replaymod/mixin/Mixin_EffectRenderer.java | 80 ---- .../mixin/Mixin_EntityLivingBaseAccessor.java | 9 +- .../mixin/Mixin_ForceChunkLoading.java | 18 +- .../mixin/Mixin_HideDynamicResourcePacks.java | 37 -- .../replaymod/mixin/Mixin_HideNameTags.java | 8 - .../mixin/Mixin_KeyboardListener.java | 23 +- .../mixin/Mixin_MoveRealmsButton.java | 2 - ...Omnidirectional_DisableFrustumCulling.java | 15 +- .../mixin/Mixin_Omnidirectional_Rotation.java | 41 +- .../mixin/Mixin_Omnidirectional_SkipHand.java | 9 +- .../mixin/Mixin_ParticleManager.java | 18 +- .../mixin/Mixin_PlayerControllerMP.java | 102 +---- .../Mixin_RegisterDynamicResourcePacks.java | 56 --- .../replaymod/mixin/Mixin_RenderGlobal.java | 80 +--- .../mixin/Mixin_RenderHudCallback.java | 32 -- .../com/replaymod/mixin/Mixin_RenderItem.java | 28 +- .../mixin/Mixin_RenderLivingBase.java | 25 +- .../replaymod/mixin/Mixin_RenderManager.java | 68 +-- .../mixin/Mixin_ShowSpectatedHand_NoOF.java | 2 - .../mixin/Mixin_ShowSpectatedHand_OF.java | 2 - .../Mixin_SkipBlockOutlinesDuringRender.java | 4 +- .../mixin/Mixin_StabilizeCamera.java | 48 +- .../mixin/Mixin_Stereoscopic_Camera.java | 2 +- ...in_WindowsWorkaroundForTinyEXRNatives.java | 8 +- .../mixin/Mixin_WorldRendererAccessor.java | 15 - .../com/replaymod/mixin/ParticleAccessor.java | 13 +- .../mixin/SPacketSpawnMobAccessor.java | 8 - .../mixin/SPacketSpawnPlayerAccessor.java | 8 - .../com/replaymod/mixin/TimerAccessor.java | 29 +- .../mixin/WorldRendererAccessor.java | 32 -- .../pathing/gui/GuiKeyframeRepository.java | 34 +- .../player/AbstractTimelinePlayer.java | 30 +- .../replaymod/pathing/player/ReplayTimer.java | 32 +- .../pathing/properties/CameraProperties.java | 3 +- .../pathing/properties/SpectatorProperty.java | 8 +- .../pathing/properties/TimestampProperty.java | 3 +- .../recording/ReplayModRecording.java | 35 +- .../replaymod/recording/ServerInfoExt.java | 12 +- .../recording/gui/GuiRecordingControls.java | 22 +- .../recording/gui/GuiRecordingOverlay.java | 14 +- .../recording/gui/GuiSavingReplay.java | 20 +- .../handler/ConnectionEventHandler.java | 36 +- .../recording/handler/GuiHandler.java | 11 +- .../handler/RecordingEventHandler.java | 248 ++--------- .../recording/packet/PacketListener.java | 165 +------ .../packet/ResourcePackRecorder.java | 166 +------ .../replaymod/render/CameraPathExporter.java | 40 +- .../java/com/replaymod/render/EXRWriter.java | 8 +- .../com/replaymod/render/FFmpegWriter.java | 20 +- .../java/com/replaymod/render/PNGWriter.java | 2 +- .../com/replaymod/render/RenderSettings.java | 10 +- .../com/replaymod/render/ReplayModRender.java | 22 +- .../render/blend/BlendMaterials.java | 2 +- .../render/blend/BlendMeshBuilder.java | 113 +---- .../replaymod/render/blend/BlendState.java | 20 +- .../com/replaymod/render/blend/Exporter.java | 15 +- .../com/replaymod/render/blend/ToJson.java | 14 +- .../java/com/replaymod/render/blend/Util.java | 24 +- .../replaymod/render/blend/data/DMesh.java | 30 +- .../replaymod/render/blend/data/DObject.java | 8 +- .../render/blend/data/DPackedFile.java | 3 +- .../replaymod/render/blend/data/DScene.java | 6 +- .../render/blend/data/Serializer.java | 2 - .../render/blend/exporters/ChunkExporter.java | 174 -------- .../blend/exporters/EntityExporter.java | 6 - .../render/blend/exporters/ItemExporter.java | 65 +-- .../exporters/ModelRendererExporter.java | 29 +- .../blend/exporters/ParticlesExporter.java | 51 +-- .../render/blend/exporters/RenderState.java | 10 +- .../blend/exporters/TileEntityExporter.java | 13 - .../capturer/CubicOpenGlFrameCapturer.java | 3 +- .../capturer/CubicPboOpenGlFrameCapturer.java | 1 + .../render/capturer/ODSFrameCapturer.java | 17 +- .../render/capturer/OpenGlFrameCapturer.java | 7 - .../capturer/PboOpenGlFrameCapturer.java | 1 - .../render/capturer/WorldRenderer.java | 1 + .../render/events/ReplayRenderCallback.java | 2 +- .../replaymod/render/gui/GuiExportFailed.java | 8 +- .../replaymod/render/gui/GuiRenderQueue.java | 58 +-- .../render/gui/GuiRenderSettings.java | 36 +- .../render/gui/GuiRenderingDone.java | 6 +- .../render/gui/GuiVideoRenderer.java | 56 +-- .../render/hooks/EntityRendererHandler.java | 41 +- .../render/metadata/MetadataInjector.java | 50 +-- .../processor/CubicToBitmapProcessor.java | 2 +- .../EquirectangularToBitmapProcessor.java | 6 +- .../processor/ODSToBitmapProcessor.java | 2 +- .../processor/OpenGlToBitmapProcessor.java | 2 +- .../replaymod/render/rendering/Pipeline.java | 4 +- .../replaymod/render/rendering/Pipelines.java | 23 +- .../render/rendering/VideoRenderer.java | 222 +--------- .../com/replaymod/render/shader/Program.java | 12 +- .../replaymod/render/utils/JailingQueue.java | 35 +- .../render/utils/PixelBufferObject.java | 70 +-- .../com/replaymod/render/utils/RenderJob.java | 9 +- .../com/replaymod/render/utils/Utils.java | 22 +- .../replaymod/replay/FullReplaySender.java | 413 +++--------------- .../replaymod/replay/InputReplayTimer.java | 82 +--- .../com/replaymod/replay/NoGuiScreenshot.java | 40 +- .../replaymod/replay/QuickReplaySender.java | 87 +--- .../com/replaymod/replay/ReplayHandler.java | 256 ++--------- .../com/replaymod/replay/ReplayModReplay.java | 17 +- .../com/replaymod/replay/ReplaySender.java | 9 +- .../java/com/replaymod/replay/Setting.java | 1 + .../replay/camera/CameraController.java | 1 + .../replaymod/replay/camera/CameraEntity.java | 342 +++------------ .../camera/ClassicCameraController.java | 46 +- .../camera/SpectatorCameraController.java | 27 +- .../camera/VanillaCameraController.java | 2 +- .../replay/events/ReplayChatMessageEvent.java | 4 +- .../replay/events/ReplayClosedCallback.java | 2 +- .../replay/events/ReplayClosingCallback.java | 2 +- .../events/ReplayDispatchKeypressesEvent.java | 12 - .../replay/events/ReplayOpenedCallback.java | 2 +- .../gui/overlay/GuiEditMarkerPopup.java | 2 +- .../replay/gui/overlay/GuiMarkerTimeline.java | 12 +- .../replay/gui/overlay/GuiReplayOverlay.java | 21 +- .../gui/screen/GuiModCompatWarning.java | 4 +- .../replay/gui/screen/GuiOpeningReplay.java | 19 - .../replay/gui/screen/GuiReplayViewer.java | 59 +-- .../replaymod/replay/handler/GuiHandler.java | 151 ++----- .../simplepathing/ReplayModSimplePathing.java | 23 +- .../replaymod/simplepathing/SPTimeline.java | 22 +- .../simplepathing/gui/GuiEditKeyframe.java | 34 +- .../gui/GuiKeyframeTimeline.java | 15 +- .../simplepathing/gui/GuiPathing.java | 74 ++-- .../simplepathing/preview/PathPreview.java | 2 +- .../preview/PathPreviewRenderer.java | 61 ++- .../ExplicitInterpolationProperty.java | 2 +- .../assets/replaymod/shader/ods.frag | 14 +- .../assets/replaymod/shader/ods.vert | 12 +- .../mixins.compat.mapwriter.replaymod.json | 7 +- .../mixins.compat.shaders.replaymod.json | 14 +- src/main/resources/mixins.core.replaymod.json | 17 +- src/main/resources/mixins.jgui.json | 13 +- .../resources/mixins.recording.replaymod.json | 24 +- .../mixins.render.blend.replaymod.json | 21 +- .../resources/mixins.render.replaymod.json | 35 +- .../resources/mixins.replay.replaymod.json | 36 +- src/main/resources/pack.mcmeta | 14 +- 306 files changed, 1708 insertions(+), 7448 deletions(-) diff --git a/src/main/java/com/replaymod/compat/ReplayModCompat.java b/src/main/java/com/replaymod/compat/ReplayModCompat.java index 0d154b89..f5be2aac 100644 --- a/src/main/java/com/replaymod/compat/ReplayModCompat.java +++ b/src/main/java/com/replaymod/compat/ReplayModCompat.java @@ -1,37 +1,18 @@ package com.replaymod.compat; import com.replaymod.compat.optifine.DisableFastRender; +import com.replaymod.compat.shaders.ShaderBeginRender; import com.replaymod.core.Module; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -//#if MC<11400 -//$$ import com.replaymod.compat.oranges17animations.HideInvisibleEntities; -//#endif - -//#if MC<11400 -//$$ import com.replaymod.compat.bettersprinting.DisableBetterSprinting; -//#endif - -//#if MC>=10800 -import com.replaymod.compat.shaders.ShaderBeginRender; -//#endif - public class ReplayModCompat implements Module { public static Logger LOGGER = LogManager.getLogger(); @Override public void initClient() { - //#if MC>=10800 new ShaderBeginRender().register(); - //#endif new DisableFastRender().register(); - //#if MC<11400 - //$$ new HideInvisibleEntities().register(); - //#endif - //#if MC<11400 - //$$ DisableBetterSprinting.register(); - //#endif } } diff --git a/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java b/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java index 6943abf3..2d5e72eb 100644 --- a/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java +++ b/src/main/java/com/replaymod/compat/optifine/DisableFastRender.java @@ -1,7 +1,7 @@ package com.replaymod.compat.optifine; -import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.core.versions.MCVer; +import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.render.events.ReplayRenderCallback; import net.minecraft.client.Minecraft; @@ -11,7 +11,10 @@ public class DisableFastRender extends EventRegistrations { private boolean wasFastRender = false; - { on(ReplayRenderCallback.Pre.EVENT, renderer -> onRenderBegin()); } + { + on(ReplayRenderCallback.Pre.EVENT, renderer -> onRenderBegin()); + } + private void onRenderBegin() { if (!MCVer.hasOptifine()) return; @@ -23,7 +26,10 @@ private void onRenderBegin() { } } - { on(ReplayRenderCallback.Post.EVENT, renderer -> onRenderEnd()); } + { + on(ReplayRenderCallback.Post.EVENT, renderer -> onRenderEnd()); + } + private void onRenderEnd() { if (!MCVer.hasOptifine()) return; diff --git a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java index fd88ac10..ce474833 100644 --- a/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java +++ b/src/main/java/com/replaymod/compat/shaders/ShaderBeginRender.java @@ -1,9 +1,8 @@ -//#if MC>=10800 package com.replaymod.compat.shaders; import com.replaymod.core.events.PreRenderCallback; -import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.Minecraft; import java.lang.reflect.InvocationTargetException; @@ -16,8 +15,10 @@ public class ShaderBeginRender extends EventRegistrations { * Invokes Shaders#beginRender when rendering a video, * as this would usually get called by EntityRenderer#renderWorld, * which we're not calling during rendering. - */ - { on(PreRenderCallback.EVENT, this::onRenderTickStart); } + */ { + on(PreRenderCallback.EVENT, this::onRenderTickStart); + } + private void onRenderTickStart() { if (ShaderReflection.shaders_beginRender == null) return; if (ShaderReflection.config_isShaders == null) return; @@ -31,9 +32,7 @@ private void onRenderTickStart() { if (!(boolean) (ShaderReflection.config_isShaders.invoke(null))) return; ShaderReflection.shaders_beginRender.invoke(null, mc, - //#if MC>=11400 mc.gameRenderer.getActiveRenderInfo(), - //#endif mc.getRenderPartialTicks(), 0); } catch (IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); @@ -41,4 +40,3 @@ private void onRenderTickStart() { } } -//#endif diff --git a/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java b/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java index e71b2035..be403ef7 100644 --- a/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java +++ b/src/main/java/com/replaymod/compat/shaders/ShaderReflection.java @@ -1,11 +1,7 @@ -//#if MC>=10800 package com.replaymod.compat.shaders; import net.minecraft.client.Minecraft; - -//#if MC>=11400 import net.minecraft.client.renderer.ActiveRenderInfo; -//#endif import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -42,9 +38,7 @@ public class ShaderReflection { shaders_isShadowPass.setAccessible(true); shaders_beginRender = shadersClass.getDeclaredMethod("beginRender", Minecraft.class, - //#if MC>=11400 ActiveRenderInfo.class, - //#endif float.class, long.class); shaders_beginRender.setAccessible(true); @@ -63,4 +57,3 @@ public class ShaderReflection { } } } -//#endif diff --git a/src/main/java/com/replaymod/core/DummyChainLoadEntryPoint.java b/src/main/java/com/replaymod/core/DummyChainLoadEntryPoint.java index 11f7edc2..e69de29b 100644 --- a/src/main/java/com/replaymod/core/DummyChainLoadEntryPoint.java +++ b/src/main/java/com/replaymod/core/DummyChainLoadEntryPoint.java @@ -1,18 +0,0 @@ -//#if FABRIC>=1 -//$$ package com.replaymod.core; -//$$ -//$$ import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; -//$$ -//$$ // Required for ReplayModMMLauncher. -//$$ // -//$$ // Chain-loading mixin configurations only works when the first class that is loaded doesn't have any mixins which -//$$ // target it. The first class would ordinarily be MC's Main but there are valid use cases for targeting it, see -//$$ // e.g. https://github.com/ReplayMod/ReplayMod/issues/327 -//$$ // So, instead of relying on the bad assumption that Main doesn't have any mixins, we'll instead register this -//$$ // dummy pre-launch entry point which is practically guaranteed to not have any mixins and gets called before Main. -//$$ public class DummyChainLoadEntryPoint implements PreLaunchEntrypoint { -//$$ @Override -//$$ public void onPreLaunch() { -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/core/KeyBindingRegistry.java b/src/main/java/com/replaymod/core/KeyBindingRegistry.java index 4ff3cd1b..4ebfaf2d 100644 --- a/src/main/java/com/replaymod/core/KeyBindingRegistry.java +++ b/src/main/java/com/replaymod/core/KeyBindingRegistry.java @@ -2,42 +2,23 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; -import com.replaymod.core.events.PreRenderCallback; -import com.replaymod.mixin.KeyBindingAccessor; -import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.core.events.KeyBindingEventCallback; import com.replaymod.core.events.KeyEventCallback; +import com.replaymod.core.events.PreRenderCallback; +import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.mixin.KeyBindingAccessor; import net.minecraft.client.settings.KeyBinding; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.ReportedException; - -//#if FABRIC>=1 -//$$ import com.replaymod.core.versions.LangResourcePack; -//$$ import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; -//$$ import net.minecraft.client.util.InputUtil; -//$$ import net.minecraft.util.Identifier; -//$$ import static com.replaymod.core.ReplayMod.MOD_ID; -//#else import net.minecraftforge.fml.client.registry.ClientRegistry; -//#endif - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; + +import java.util.*; import java.util.function.Consumer; import java.util.function.Supplier; public class KeyBindingRegistry extends EventRegistrations { private static final String CATEGORY = "replaymod.title"; - //#if FABRIC>=1 - //$$ static { net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.addCategory(CATEGORY); } - //#endif private final Map bindings = new HashMap<>(); private Set onlyInReplay = new HashSet<>(); @@ -58,18 +39,8 @@ public Binding registerRepeatedKeyBinding(String name, int keyCode, Runnable whe private Binding registerKeyBinding(String name, int keyCode, boolean onlyInRepay) { Binding binding = bindings.get(name); if (binding == null) { - //#if FABRIC>=1 - //$$ if (keyCode == 0) { - //$$ keyCode = -1; - //$$ } - //$$ Identifier id = new Identifier(MOD_ID, name.substring(LangResourcePack.LEGACY_KEY_PREFIX.length())); - //$$ FabricKeyBinding fabricKeyBinding = FabricKeyBinding.Builder.create(id, InputUtil.Type.KEYSYM, keyCode, CATEGORY).build(); - //$$ net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.register(fabricKeyBinding); - //$$ KeyBinding keyBinding = fabricKeyBinding; - //#else KeyBinding keyBinding = new KeyBinding(name, keyCode, CATEGORY); ClientRegistry.registerKeyBinding(keyBinding); - //#endif binding = new Binding(name, keyBinding); bindings.put(name, binding); if (onlyInRepay) { @@ -93,7 +64,9 @@ public Set getOnlyInReplay() { return Collections.unmodifiableSet(onlyInReplay); } - { on(PreRenderCallback.EVENT, this::handleRepeatedKeyBindings); } + { + on(PreRenderCallback.EVENT, this::handleRepeatedKeyBindings); + } public void handleRepeatedKeyBindings() { for (Binding binding : bindings.values()) { @@ -103,7 +76,10 @@ public void handleRepeatedKeyBindings() { } } - { on(KeyBindingEventCallback.EVENT, this::handleKeyBindings); } + { + on(KeyBindingEventCallback.EVENT, this::handleKeyBindings); + } + private void handleKeyBindings() { for (Binding binding : bindings.values()) { while (binding.keyBinding.isPressed()) { @@ -127,7 +103,10 @@ private void invokeKeyBindingHandlers(Binding binding, Collection hand } } - { on(KeyEventCallback.EVENT, (keyCode, scanCode, action, modifiers) -> handleRaw(keyCode, action)); } + { + on(KeyEventCallback.EVENT, (keyCode, scanCode, action, modifiers) -> handleRaw(keyCode, action)); + } + private boolean handleRaw(int keyCode, int action) { if (action != KeyEventCallback.ACTION_PRESS) return false; for (final Supplier handler : rawHandlers.get(keyCode)) { @@ -169,11 +148,7 @@ public String getBoundKey() { } public boolean isBound() { - //#if MC>=11400 return !keyBinding.isInvalid(); - //#else - //$$ return keyBinding.getKeyCode() != 0; - //#endif } public void trigger() { diff --git a/src/main/java/com/replaymod/core/MinecraftMethodAccessor.java b/src/main/java/com/replaymod/core/MinecraftMethodAccessor.java index ef70e2a3..aaa7fe9c 100644 --- a/src/main/java/com/replaymod/core/MinecraftMethodAccessor.java +++ b/src/main/java/com/replaymod/core/MinecraftMethodAccessor.java @@ -1,17 +1,7 @@ package com.replaymod.core; public interface MinecraftMethodAccessor { - //#if MC>=11400 void replayModProcessKeyBinds(); - //#else - //#if MC>=10904 - //$$ void replayModRunTickMouse(); - //$$ void replayModRunTickKeyboard(); - //#else - //$$ void replayModSetEarlyReturnFromRunTick(boolean earlyReturn); - //#endif - //#endif - //#if MC>=11400 + void replayModExecuteTaskQueue(); - //#endif } diff --git a/src/main/java/com/replaymod/core/Module.java b/src/main/java/com/replaymod/core/Module.java index 321b1613..9fa45fa7 100644 --- a/src/main/java/com/replaymod/core/Module.java +++ b/src/main/java/com/replaymod/core/Module.java @@ -2,9 +2,14 @@ public interface Module { // FMLCommonSetupEvent for 1.13+, FMLInitializationEvent below - default void initCommon() {} + default void initCommon() { + } + // FMLClientSetupEvent for 1.13+, FMLInitializationEvent (if client) below - default void initClient() {} + default void initClient() { + } + // FMLClientSetupEvent for 1.13+, FMLInitializationEvent below - default void registerKeyBindings(KeyBindingRegistry registry) {} + default void registerKeyBindings(KeyBindingRegistry registry) { + } } diff --git a/src/main/java/com/replaymod/core/ReplayMod.java b/src/main/java/com/replaymod/core/ReplayMod.java index 10f53b05..5b188a81 100644 --- a/src/main/java/com/replaymod/core/ReplayMod.java +++ b/src/main/java/com/replaymod/core/ReplayMod.java @@ -10,6 +10,7 @@ import com.replaymod.core.versions.scheduler.SchedulerImpl; import com.replaymod.editor.ReplayModEditor; import com.replaymod.extras.ReplayModExtras; +import com.replaymod.gui.container.GuiScreen; import com.replaymod.recording.ReplayModRecording; import com.replaymod.render.ReplayModRender; import com.replaymod.replay.ReplayModReplay; @@ -19,16 +20,11 @@ import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersion; import com.replaymod.replaystudio.util.I18n; import com.replaymod.simplepathing.ReplayModSimplePathing; -import com.replaymod.gui.container.GuiScreen; -import net.minecraft.client.Minecraft; import net.minecraft.client.AbstractOption; +import net.minecraft.client.Minecraft; import net.minecraft.resources.FolderPack; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.Style; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.util.text.TextFormatting; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.*; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; @@ -38,11 +34,7 @@ import java.io.InputStream; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; -import java.nio.file.DirectoryStream; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.SimpleFileVisitor; +import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; @@ -63,11 +55,15 @@ public class ReplayMod implements Module, Scheduler { private final SchedulerImpl scheduler = new SchedulerImpl(); private final KeyBindingRegistry keyBindingRegistry = new KeyBindingRegistry(); private final SettingsRegistry settingsRegistry = new SettingsRegistry(); + { settingsRegistry.register(Setting.class); } - { instance = this; } + { + instance = this; + } + public static ReplayMod instance; private final List modules = new ArrayList<>(); @@ -78,7 +74,7 @@ public class ReplayMod implements Module, Scheduler { * Whether the current MC version is supported by the embedded ReplayStudio version. * If this is not the case (i.e. if this is variable true), any feature of the RM which depends on the ReplayStudio * lib will be disabled. - * + *

* Cancelling the RenderPlayerEvent.Pre is insufficient because it affects neither the shadows nor the fire texture. * See: https://github.com/MinecraftForge/MinecraftForge/issues/2987 - * + *

* The previous solution was to overwrite the RenderPlayer instances which has been dropped in favor of this one * because it is less compatible with other mods whereas this one should be fine as long as no other mod completely * overwrites the shouldRender method. * One example of the previous solution breaking is when used with VanillaEnhancements because it replaces the * RenderManager with a new custom one which in turn will reset our registered RenderPlayer instances because * it does so after we have already registered with the old RenderManager. - * + *

* For 1.7.10, that method doesn't exist, so we use a combination of the event and inject into */ @Mixin(value = EntityRenderer.class, priority = 1200) public abstract class MixinRender { - //#if MC>=10800 - @Inject(method = "shouldRender", at=@At("HEAD"), cancellable = true) + @Inject(method = "shouldRender", at = @At("HEAD"), cancellable = true) public void replayModExtras_isPlayerHidden(Entity entity, @Coerce Object camera, double camX, double camY, double camZ, CallbackInfoReturnable ci) { ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { if (entity instanceof PlayerEntity) { @@ -45,17 +39,4 @@ public void replayModExtras_isPlayerHidden(Entity entity, @Coerce Object camera, } }); } - //#else - //$$ @Inject(method = "doRenderShadowAndFire", at=@At("HEAD"), cancellable = true) - //$$ private void replayModExtras_isPlayerHidden(Entity entity, double x, double y, double z, float yaw, float time, CallbackInfo ci) { - //$$ ReplayModExtras.instance.get(PlayerOverview.class).ifPresent(playerOverview -> { - //$$ if (entity instanceof EntityPlayer) { - //$$ EntityPlayer player = (EntityPlayer) entity; - //$$ if (playerOverview.isHidden(player.getUniqueID())) { - //$$ ci.cancel(); - //$$ } - //$$ } - //$$ }); - //$$ } - //#endif } diff --git a/src/main/java/com/replaymod/mixin/MixinRenderArrow.java b/src/main/java/com/replaymod/mixin/MixinRenderArrow.java index fb63c619..fc4dfe87 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderArrow.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderArrow.java @@ -1,19 +1,13 @@ -//#if MC>=10800 package com.replaymod.mixin; import com.replaymod.replay.ReplayModReplay; +import net.minecraft.client.renderer.culling.ClippingHelper; import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.TippedArrowRenderer; import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.entity.TippedArrowRenderer; import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Mixin; -//#if MC>=11500 -import net.minecraft.client.renderer.culling.ClippingHelper; -//#else -//$$ import net.minecraft.client.render.VisibleRegion; -//#endif - @Mixin(TippedArrowRenderer.class) public abstract class MixinRenderArrow extends EntityRenderer { protected MixinRenderArrow(EntityRendererManager renderManager) { @@ -23,14 +17,9 @@ protected MixinRenderArrow(EntityRendererManager renderManager) { @SuppressWarnings("unchecked") @Override public boolean shouldRender(Entity entity, - //#if MC>=11500 ClippingHelper camera, - //#else - //$$ VisibleRegion camera, - //#endif double camX, double camY, double camZ) { // Force arrows to always render, otherwise they stop rendering when you get close to them return ReplayModReplay.instance.getReplayHandler() != null || super.shouldRender(entity, camera, camX, camY, camZ); } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/mixin/MixinRenderGlobal.java index f7a4846d..c4055eeb 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderGlobal.java @@ -2,15 +2,12 @@ import com.replaymod.recording.handler.RecordingEventHandler; import net.minecraft.client.renderer.WorldRenderer; +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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#if MC>=10800 -import net.minecraft.util.math.BlockPos; -//#endif - @Mixin(WorldRenderer.class) public abstract class MixinRenderGlobal implements RecordingEventHandler.RecordingEventSender { @@ -26,25 +23,13 @@ public RecordingEventHandler getRecordingEventHandler() { return recordingEventHandler; } - //#if MC>=10800 @Inject(method = "sendBlockBreakProgress", at = @At("HEAD")) - //#else - //$$ @Inject(method = "destroyBlockPartially", at = @At("HEAD")) - //#endif public void saveBlockBreakProgressPacket(int breakerId, - //#if MC>=10800 BlockPos pos, - //#else - //$$ int x, int y, int z, - //#endif int progress, CallbackInfo info) { if (recordingEventHandler != null) { recordingEventHandler.onBlockBreakAnim(breakerId, - //#if MC>=10800 pos, - //#else - //$$ x, y, z, - //#endif progress); } } diff --git a/src/main/java/com/replaymod/mixin/MixinRenderItem.java b/src/main/java/com/replaymod/mixin/MixinRenderItem.java index 81881776..e39c2fcb 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderItem.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderItem.java @@ -1,64 +1,24 @@ -//#if MC>=10800 package com.replaymod.mixin; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.ItemExporter; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#if MC>=11500 -import com.mojang.blaze3d.vertex.IVertexBuilder; -import com.mojang.blaze3d.matrix.MatrixStack; -//#endif - -//#if MC>=11400 -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.model.IBakedModel; -//#else -//#if MC>=10904 -//$$ import net.minecraft.client.renderer.RenderItem; -//$$ import net.minecraft.client.renderer.block.model.IBakedModel; -//#else -//$$ import net.minecraft.client.renderer.entity.RenderItem; -//$$ import net.minecraft.client.resources.model.IBakedModel; -//#endif -//#endif - -//#if MC>=11400 @Mixin(ItemRenderer.class) -//#else -//$$ @Mixin(RenderItem.class) -//#endif public abstract class MixinRenderItem { - //#if MC>=11500 @Inject(method = "renderModel", at = @At("HEAD")) private void onRenderModel(IBakedModel model, ItemStack stack, int int_1, int int_2, MatrixStack matrixStack_1, IVertexBuilder vertexConsumer_1, CallbackInfo ci) { - //#else - //#if MC>=11400 - //$$ @Inject(method = "renderItemModel", at = @At("HEAD")) - //#else - //#if MC>=11400 - //$$ @Inject(method = "renderModel(Lnet/minecraft/client/renderer/model/IBakedModel;Lnet/minecraft/item/ItemStack;)V", - //$$ at = @At("HEAD")) - //#else - //#if MC>=10904 - //$$ @Inject(method = "renderModel(Lnet/minecraft/client/renderer/block/model/IBakedModel;Lnet/minecraft/item/ItemStack;)V", - //$$ at = @At("HEAD")) - //#else - //$$ @Inject(method = "renderModel(Lnet/minecraft/client/resources/model/IBakedModel;Lnet/minecraft/item/ItemStack;)V", - //$$ at = @At("HEAD")) - //#endif - //#endif - //#endif - //$$ private void onRenderModel(BakedModel model, ItemStack stack, CallbackInfo ci) { - //#endif BlendState blendState = BlendState.getState(); if (blendState != null) { blendState.get(ItemExporter.class).onRender(this, model, stack); } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinRenderLivingBase.java b/src/main/java/com/replaymod/mixin/MixinRenderLivingBase.java index f2369810..175c827f 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderLivingBase.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderLivingBase.java @@ -1,44 +1,18 @@ -//#if MC>=10800 package com.replaymod.mixin; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.EntityExporter; +import net.minecraft.client.renderer.entity.LivingRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#if MC>=10904 -import net.minecraft.client.renderer.entity.LivingRenderer; -//#else -//$$ import net.minecraft.client.renderer.entity.RendererLivingEntity; -//#endif - -//#if MC>=10904 @Mixin(LivingRenderer.class) -//#else -//$$ @Mixin(RendererLivingEntity.class) -//#endif public abstract class MixinRenderLivingBase { - //#if MC>=11500 @Inject(method = "render", at = @At( - //#else - //#if FABRIC>=1 - //$$ @Inject(method = "render(Lnet/minecraft/entity/LivingEntity;DDDFF)V", at = @At( - //#else - //$$ @Inject(method = "doRender(Lnet/minecraft/entity/LivingEntity;DDDFF)V", at = @At( - //#endif - //#endif value = "INVOKE", - //#if MC>=11500 target = "Lnet/minecraft/client/renderer/entity/LivingRenderer;preRenderCallback(Lnet/minecraft/entity/LivingEntity;Lcom/mojang/blaze3d/matrix/MatrixStack;F)V", - //#else - //#if MC>=10904 - //$$ target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;scaleAndTranslate(Lnet/minecraft/entity/LivingEntity;F)F", - //#else - //$$ target = "Lnet/minecraft/client/renderer/entity/RendererLivingEntity;preRenderCallback(Lnet/minecraft/entity/EntityLivingBase;F)V", - //#endif - //#endif shift = At.Shift.AFTER )) private void recordModelMatrix(CallbackInfo ci) { @@ -48,4 +22,3 @@ private void recordModelMatrix(CallbackInfo ci) { } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinRenderManager.java b/src/main/java/com/replaymod/mixin/MixinRenderManager.java index d870a373..aa29b5e9 100644 --- a/src/main/java/com/replaymod/mixin/MixinRenderManager.java +++ b/src/main/java/com/replaymod/mixin/MixinRenderManager.java @@ -1,74 +1,37 @@ package com.replaymod.mixin; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.core.versions.MCVer; import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.entity.EntityRendererManager; import net.minecraft.entity.Entity; +import net.minecraft.util.math.vector.Quaternion; +import net.minecraft.util.math.vector.Vector3f; 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; - -//#if MC>=11500 -import net.minecraft.client.renderer.IRenderTypeBuffer; -import com.mojang.blaze3d.matrix.MatrixStack; -import net.minecraft.util.math.vector.Vector3f; -import net.minecraft.util.math.vector.Quaternion; -//#endif - -//#if MC>=10904 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#else -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#endif @Mixin(EntityRendererManager.class) public abstract class MixinRenderManager { - //#if MC>=11500 - @Shadow private Quaternion cameraOrientation; - //#else - //$$ @Shadow private float cameraPitch; - //$$ @Shadow private float cameraYaw; - //#endif + @Shadow + private Quaternion cameraOrientation; - //#if MC>=11500 @Inject(method = "renderEntityStatic", at = @At("HEAD")) - //#else - //#if MC>=11400 && FABRIC>=1 - //$$ @Inject(method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", at = @At("HEAD")) - //#else - //#if MC>=11400 - //$$ @Inject(method = "renderEntity", at = @At("HEAD")) - //#else - //$$ @Inject(method = "doRenderEntity", at = @At("HEAD")) - //#endif - //#endif - //#endif - //#if MC>=10904 private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, - //#if MC>=11500 MatrixStack matrixStack, IRenderTypeBuffer vertexConsumerProvider, int int_1, - //#else - //$$ boolean iDoNotCare, - //#endif CallbackInfo ci) { - //#else - //$$ private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfoReturnable ci) { - //#endif EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); if (handler != null && handler.omnidirectional) { double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); double yaw = -Math.atan2(dx, dz); - //#if MC>=11500 this.cameraOrientation = new Quaternion(0.0F, 0.0F, 0.0F, 1.0F); this.cameraOrientation.multiply(Vector3f.YP.rotationDegrees((float) -yaw)); this.cameraOrientation.multiply(Vector3f.XP.rotationDegrees((float) pitch)); - //#else - //$$ this.cameraPitch = (float) Math.toDegrees(pitch); - //$$ this.cameraYaw = (float) Math.toDegrees(yaw); - //#endif } } } diff --git a/src/main/java/com/replaymod/mixin/MixinScreen.java b/src/main/java/com/replaymod/mixin/MixinScreen.java index ad0e305f..81e689c8 100644 --- a/src/main/java/com/replaymod/mixin/MixinScreen.java +++ b/src/main/java/com/replaymod/mixin/MixinScreen.java @@ -16,7 +16,8 @@ @Mixin(Screen.class) public class MixinScreen { @Shadow - protected @Final List buttons; + protected @Final + List buttons; @Inject(method = "init(Lnet/minecraft/client/Minecraft;II)V", at = @At("HEAD")) private void preInit(Minecraft minecraftClient_1, int int_1, int int_2, CallbackInfo ci) { diff --git a/src/main/java/com/replaymod/mixin/MixinShaderEntityRenderer.java b/src/main/java/com/replaymod/mixin/MixinShaderEntityRenderer.java index 959700d6..81490441 100644 --- a/src/main/java/com/replaymod/mixin/MixinShaderEntityRenderer.java +++ b/src/main/java/com/replaymod/mixin/MixinShaderEntityRenderer.java @@ -1,4 +1,3 @@ -//#if MC>=10800 package com.replaymod.mixin; import com.replaymod.compat.shaders.ShaderReflection; @@ -13,15 +12,7 @@ @Mixin(GameRenderer.class) public abstract class MixinShaderEntityRenderer { - //#if MC>=11400 @Inject(method = "renderWorld", at = @At("HEAD")) - //#else - //#if MC>=11400 - //$$ @Inject(method = "updateCameraAndRender(FJ)V", at = @At("HEAD")) - //#else - //$$ @Inject(method = "renderWorldPass", at = @At("HEAD")) - //#endif - //#endif private void replayModCompat_updateShaderFrameTimeCounter(CallbackInfo ignore) { if (ReplayModReplay.instance.getReplayHandler() == null) return; if (ShaderReflection.shaders_frameTimeCounter == null) return; @@ -35,4 +26,3 @@ private void replayModCompat_updateShaderFrameTimeCounter(CallbackInfo ignore) { } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinShaderRenderChunk.java b/src/main/java/com/replaymod/mixin/MixinShaderRenderChunk.java index a8f08873..08aeb6bd 100644 --- a/src/main/java/com/replaymod/mixin/MixinShaderRenderChunk.java +++ b/src/main/java/com/replaymod/mixin/MixinShaderRenderChunk.java @@ -1,40 +1,33 @@ -//#if MC>=10800 package com.replaymod.mixin; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.Minecraft; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#if MC>=11500 -import org.spongepowered.asm.mixin.Shadow; -//#endif - -//#if MC>=11500 @Mixin(net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.ChunkRender.class) -//#else -//$$ @Mixin(net.minecraft.client.render.chunk.ChunkRenderer.class) -//#endif public abstract class MixinShaderRenderChunk { private final Minecraft mc = Minecraft.getInstance(); - //#if MC>=11500 - @Shadow private int frameIndex; + @Shadow + private int frameIndex; - @Shadow public abstract boolean shouldStayLoaded(); + @Shadow + public abstract boolean shouldStayLoaded(); /** * So, for some reason OF though it'd be a good idea to drop the `shouldBuild` check from the chunk traversal in * the setupTerrain method (see the innermost if of the "iteration" profiler section). * Hint: It's not a good idea. It'll cause chunks to be queued for building which should not be built. And because - * they don't know any better, they'll even re-queue themselves (which looks like a race condition in vanilla - * MC) causing a live-lock when we try to force-build all chunks (or at least it would cause a lockup if it - * wasn't for the vanilla race condition which slowly causes some of the rebuild tasks to get lost over time, - * eventually, potentially all of them). + * they don't know any better, they'll even re-queue themselves (which looks like a race condition in vanilla + * MC) causing a live-lock when we try to force-build all chunks (or at least it would cause a lockup if it + * wasn't for the vanilla race condition which slowly causes some of the rebuild tasks to get lost over time, + * eventually, potentially all of them). * This is the most convenient place to re-introduce the check (setRebuildFrame would normally be called right after * shouldBuild, if it returns true). */ @@ -53,12 +46,11 @@ private void replayModCompat_OFHaveYouConsideredWhetherThisChunkShouldEvenBeBuil ci.setReturnValue(false); } } - //#endif /** - * Changes the RenderChunk#isPlayerUpdate method that Optifine adds - * to always return true while rendering so no chunks are being added - * to a separate rendering queue + * Changes the RenderChunk#isPlayerUpdate method that Optifine adds + * to always return true while rendering so no chunks are being added + * to a separate rendering queue */ @Inject(method = "isPlayerUpdate", at = @At("HEAD"), cancellable = true, remap = false) private void replayModCompat_disableIsPlayerUpdate(CallbackInfoReturnable ci) { @@ -68,4 +60,3 @@ private void replayModCompat_disableIsPlayerUpdate(CallbackInfoReturnable=11600 -import net.minecraft.client.renderer.ActiveRenderInfo; -import com.mojang.blaze3d.matrix.MatrixStack; -//#endif - -//#if MC>=11400 -import com.replaymod.core.events.PreRenderHandCallback; -//#else -//$$ import com.replaymod.core.versions.MCVer; -//$$ import net.minecraftforge.client.ForgeHooksClient; -//#endif - @Pseudo @Mixin(targets = { "shadersmod/client/ShadersRender", // Pre Optifine 1.12.2 E1 @@ -26,27 +17,14 @@ }, remap = false) public abstract class MixinShadersRender { - @Inject(method = { "renderHand0", "renderHand1" }, at = @At("HEAD"), cancellable = true, remap = false) + @Inject(method = {"renderHand0", "renderHand1"}, at = @At("HEAD"), cancellable = true, remap = false) private static void replayModCompat_disableRenderHand0( GameRenderer er, - //#if MC>=11600 MatrixStack stack, ActiveRenderInfo camera, - //#endif float partialTicks, - //#if MC<11600 - //$$ int renderPass, - //#endif CallbackInfo ci) { - //#if MC>=11400 if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) { - //#else - //#if MC>=11400 - //$$ if (ForgeHooksClient.renderFirstPersonHand(MCVer.getMinecraft().renderGlobal, partialTicks)) { - //#else - //$$ if (ForgeHooksClient.renderFirstPersonHand(MCVer.getMinecraft().renderGlobal, partialTicks, renderPass)) { - //#endif - //#endif ci.cancel(); } } diff --git a/src/main/java/com/replaymod/mixin/MixinTileEntityEndPortalRenderer.java b/src/main/java/com/replaymod/mixin/MixinTileEntityEndPortalRenderer.java index 553cdd5c..d7fd6aba 100644 --- a/src/main/java/com/replaymod/mixin/MixinTileEntityEndPortalRenderer.java +++ b/src/main/java/com/replaymod/mixin/MixinTileEntityEndPortalRenderer.java @@ -2,53 +2,20 @@ import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; +import net.minecraft.util.Util; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -//#if MC>=11400 -import net.minecraft.util.Util; -//#else -//$$ import net.minecraft.client.Minecraft; -//#endif - -//#if MC>=11500 @Mixin(net.minecraft.client.renderer.RenderState.PortalTexturingState.class) -//#else -//$$ @Mixin(net.minecraft.client.render.block.entity.EndPortalBlockEntityRenderer.class) -//#endif public class MixinTileEntityEndPortalRenderer { - //#if MC>=11500 @Redirect(method = "func_228597_a_", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;milliTime()J")) static - //#else - //#if MC>=11400 - //$$ @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;getMeasuringTimeMs()J")) - //#else - //#if MC>=11200 - //$$ @Redirect(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntityEndPortal;DDDFIF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) - //#else - //#if MC>=10809 - //$$ @Redirect(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntityEndPortal;DDDFI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) - //#else - //#if MC>=10800 - //$$ @Redirect(method = "func_180544_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) - //#else - //$$ @Redirect(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntityEndPortal;DDDF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) - //#endif - //#endif - //#endif - //#endif - //#endif private long replayModReplay_getEnchantmentTime() { ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); if (replayHandler != null) { return replayHandler.getReplaySender().currentTimeStamp(); } - //#if MC>=11400 return Util.milliTime(); - //#else - //$$ return Minecraft.getSystemTime(); - //#endif } } diff --git a/src/main/java/com/replaymod/mixin/MixinTileEntityRendererDispatcher.java b/src/main/java/com/replaymod/mixin/MixinTileEntityRendererDispatcher.java index 1a01b2da..e229a285 100644 --- a/src/main/java/com/replaymod/mixin/MixinTileEntityRendererDispatcher.java +++ b/src/main/java/com/replaymod/mixin/MixinTileEntityRendererDispatcher.java @@ -1,71 +1 @@ // FIXME 1.15 -//#if MC>=10800 && MC<11500 -//$$ package com.replaymod.render.blend.mixin; -//$$ -//$$ import com.replaymod.render.blend.BlendState; -//$$ import com.replaymod.render.blend.exporters.TileEntityExporter; -//$$ import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; -//$$ import net.minecraft.block.entity.BlockEntity; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.injection.At; -//$$ import org.spongepowered.asm.mixin.injection.Inject; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ -//$$ @Mixin(BlockEntityRenderDispatcher.class) -//$$ public abstract class MixinTileEntityRendererDispatcher { -//$$ - //#if MC>=11400 - //#if MC>=11400 - //$$ @Inject(method = "renderEntity(Lnet/minecraft/block/entity/BlockEntity;DDDFIZ)V", - //$$ at = @At("HEAD")) - //#else - //$$ @Inject(method = "render(Lnet/minecraft/tileentity/TileEntity;DDDFIZ)V", - //$$ at = @At("HEAD")) - //#endif - //$$ public void preRender(BlockEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, boolean hasNoBlock, CallbackInfo ci) { - //$$ float alpha = 1; - //#else - //#if MC>=11200 - //$$ @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFIF)V", - //$$ at = @At("HEAD")) - //$$ public void preRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, float alpha, CallbackInfo ci) { - //#else - //$$ @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFI)V", - //$$ at = @At("HEAD")) - //$$ public void preRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, CallbackInfo ci) { - //$$ float alpha = 1; - //#endif - //#endif -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(TileEntityExporter.class).preRender(tileEntity, x, y, z, renderPartialTicks, destroyStage, alpha); -//$$ } -//$$ } -//$$ - //#if MC>=11400 - //#if MC>=11400 - //$$ @Inject(method = "renderEntity(Lnet/minecraft/block/entity/BlockEntity;DDDFIZ)V", - //$$ at = @At("RETURN")) - //#else - //$$ @Inject(method = "render(Lnet/minecraft/tileentity/TileEntity;DDDFIZ)V", - //$$ at = @At("RETURN")) - //#endif - //$$ public void postRender(BlockEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, boolean hasNoBlock, CallbackInfo ci) { - //#else - //#if MC>=11200 - //$$ @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFIF)V", - //$$ at = @At("RETURN")) - //$$ public void postRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, float alpha, CallbackInfo ci) { - //#else - //$$ @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFI)V", - //$$ at = @At("RETURN")) - //$$ public void postRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, CallbackInfo ci) { - //#endif - //#endif -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(TileEntityExporter.class).postRender(); -//$$ } -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinViewFrustum.java b/src/main/java/com/replaymod/mixin/MixinViewFrustum.java index a3a4733a..e2c2a7fc 100644 --- a/src/main/java/com/replaymod/mixin/MixinViewFrustum.java +++ b/src/main/java/com/replaymod/mixin/MixinViewFrustum.java @@ -1,59 +1,29 @@ -//#if MC>=10800 package com.replaymod.mixin; import net.minecraft.client.renderer.ViewFrustum; +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.ChunkRender; 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.Redirect; -//#if MC>=11500 -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.ChunkRender; -//#else -//$$ import net.minecraft.client.render.chunk.ChunkRenderer; -//#endif - @Mixin(ViewFrustum.class) public abstract class MixinViewFrustum { @Redirect( method = "updateChunkPositions", at = @At( value = "INVOKE", - //#if MC>=10904 - //#if MC>=11500 target = "Lnet/minecraft/client/renderer/chunk/ChunkRenderDispatcher$ChunkRender;setPosition(III)V" - //#else - //$$ target = "Lnet/minecraft/client/render/chunk/ChunkRenderer;setOrigin(III)V" - //#endif - //#else - //$$ target = "Lnet/minecraft/client/renderer/chunk/RenderChunk;setPosition(Lnet/minecraft/util/BlockPos;)V" - //#endif ) ) private void replayModReplay_updatePositionAndMarkForUpdate( - //#if MC>=11500 ChunkRender renderChunk, - //#else - //$$ ChunkRenderer renderChunk, - //#endif - //#if MC>=10904 int x, int y, int z - //#else - //$$ BlockPos pos - //#endif ) { - //#if MC>=10904 BlockPos pos = new BlockPos(x, y, z); - //#endif if (!pos.equals(renderChunk.getPosition())) { - //#if MC>=10904 renderChunk.setPosition(x, y, z); renderChunk.setNeedsUpdate(false); - //#else - //$$ renderChunk.setPosition(pos); - //$$ renderChunk.setNeedsUpdate(true); - //#endif } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinWorldClient.java b/src/main/java/com/replaymod/mixin/MixinWorldClient.java index d94310e3..c8f58b97 100644 --- a/src/main/java/com/replaymod/mixin/MixinWorldClient.java +++ b/src/main/java/com/replaymod/mixin/MixinWorldClient.java @@ -1,45 +1,24 @@ package com.replaymod.mixin; -//#if MC>=10904 import com.replaymod.recording.handler.RecordingEventHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.profiler.IProfiler; +import net.minecraft.util.RegistryKey; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.DimensionType; import net.minecraft.world.World; +import net.minecraft.world.storage.ISpawnWorldInfo; 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; -//#if MC>=11600 -import net.minecraft.util.RegistryKey; -import net.minecraft.world.storage.ISpawnWorldInfo; import java.util.function.Supplier; -//#else -//$$ import net.minecraft.world.level.LevelProperties; -//#endif - -//#if MC>=11400 -import net.minecraft.world.chunk.AbstractChunkProvider; -//#if MC<11600 -//$$ import net.minecraft.world.dimension.Dimension; -//#endif -import net.minecraft.world.DimensionType; -import java.util.function.BiFunction; -//#else -//$$ import net.minecraft.world.storage.ISaveHandler; -//#if MC>=11400 -//$$ import net.minecraft.world.dimension.Dimension; -//$$ import net.minecraft.world.storage.WorldSavedDataStorage; -//#else -//$$ import net.minecraft.world.WorldProvider; -//#endif -//#endif @Mixin(ClientWorld.class) @@ -47,43 +26,11 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa @Shadow private Minecraft mc; - //#if MC>=11600 protected MixinWorldClient(ISpawnWorldInfo mutableWorldProperties, RegistryKey registryKey, - //#if MC<11602 - //$$ RegistryKey registryKey2, - //#endif DimensionType dimensionType, Supplier profiler, boolean bl, boolean bl2, long l) { super(mutableWorldProperties, registryKey, - //#if MC<11602 - //$$ registryKey2, - //#endif dimensionType, profiler, bl, bl2, l); } - //#else - //#if MC>=11400 - //$$ protected MixinWorldClient(LevelProperties levelProperties_1, DimensionType dimensionType_1, BiFunction biFunction_1, Profiler profiler_1, boolean boolean_1) { - //$$ super(levelProperties_1, dimensionType_1, biFunction_1, profiler_1, boolean_1); - //$$ } - //#else - //$$ protected MixinWorldClient(ISaveHandler saveHandlerIn, - //#if MC>=11400 - //$$ WorldSavedDataStorage mapStorage, - //#endif - //$$ WorldInfo info, - //#if MC>=11400 - //$$ Dimension providerIn, - //#else - //$$ WorldProvider providerIn, - //#endif - //$$ Profiler profilerIn, boolean client) { - //$$ super(saveHandlerIn, - //#if MC>=11400 - //$$ mapStorage, - //#endif - //$$ info, providerIn, profilerIn, client); - //$$ } - //#endif - //#endif private RecordingEventHandler replayModRecording_getRecordingEventHandler() { return ((RecordingEventHandler.RecordingEventSender) this.mc.worldRenderer).getRecordingEventHandler(); @@ -93,20 +40,10 @@ private RecordingEventHandler replayModRecording_getRecordingEventHandler() { // 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 - //#if MC>=11400 - //#if FABRIC>=1 - //$$ @Inject(method = "playSound(Lnet/minecraft/entity/player/PlayerEntity;DDDLnet/minecraft/sound/SoundEvent;Lnet/minecraft/sound/SoundCategory;FF)V", - //$$ at = @At("HEAD")) - //#else @Inject(method = "playSound(Lnet/minecraft/entity/player/PlayerEntity;DDDLnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V", at = @At("HEAD")) - //#endif - //#else - //$$ @Inject(method = "playSound(Lnet/minecraft/entity/player/EntityPlayer;DDDLnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V", - //$$ at = @At("HEAD")) - //#endif public void replayModRecording_recordClientSound(PlayerEntity player, double x, double y, double z, SoundEvent sound, SoundCategory category, - float volume, float pitch, CallbackInfo ci) { + float volume, float pitch, CallbackInfo ci) { if (player == this.mc.player) { RecordingEventHandler handler = replayModRecording_getRecordingEventHandler(); if (handler != null) { @@ -116,18 +53,8 @@ public void replayModRecording_recordClientSound(PlayerEntity player, double x, } // Same goes for level events (also called effects). E.g. door open, block break, etc. - //#if MC>=11400 - //#if MC>=11600 @Inject(method = "syncWorldEvent", at = @At("HEAD")) - //#else - //$$ @Inject(method = "playLevelEvent", at = @At("HEAD")) - //#endif - private void playLevelEvent (PlayerEntity player, int type, BlockPos pos, int data, CallbackInfo ci) { - //#else - //$$ // 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) { - //#endif + private void playLevelEvent(PlayerEntity player, int type, BlockPos pos, int data, CallbackInfo ci) { if (player == this.mc.player) { // We caused this event, the server won't send it to us RecordingEventHandler handler = replayModRecording_getRecordingEventHandler(); @@ -135,9 +62,5 @@ private void playLevelEvent (PlayerEntity player, int type, BlockPos pos, int da handler.onClientEffect(type, pos, data); } } - //#if MC<11400 - //$$ super.playEvent(player, type, pos, data); - //#endif } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_BlockOnChunkRebuilds.java b/src/main/java/com/replaymod/mixin/Mixin_BlockOnChunkRebuilds.java index fe94168e..48b660c3 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_BlockOnChunkRebuilds.java +++ b/src/main/java/com/replaymod/mixin/Mixin_BlockOnChunkRebuilds.java @@ -1,6 +1,5 @@ package com.replaymod.mixin; -//#if MC>=11500 import com.mojang.blaze3d.systems.RenderSystem; import com.replaymod.render.hooks.ForceChunkLoadingHook; import net.minecraft.client.renderer.RegionRenderCacheBuilder; @@ -22,15 +21,23 @@ @Mixin(ChunkRenderDispatcher.class) public abstract class Mixin_BlockOnChunkRebuilds implements ForceChunkLoadingHook.IBlockOnChunkRebuilds { - @Shadow @Final private Queue freeBuilders; + @Shadow + @Final + private Queue freeBuilders; - @Shadow public abstract boolean runChunkUploads(); + @Shadow + public abstract boolean runChunkUploads(); - @Shadow @Final private DelegatedTaskExecutor delegatedTaskExecutor; + @Shadow + @Final + private DelegatedTaskExecutor delegatedTaskExecutor; - @Shadow protected abstract void runTask(); + @Shadow + protected abstract void runTask(); - @Shadow @Final private Queue uploadTasks; + @Shadow + @Final + private Queue uploadTasks; private final Lock waitingForWorkLock = new ReentrantLock(); private final Condition newWork = waitingForWorkLock.newCondition(); private volatile boolean allDone; @@ -123,4 +130,3 @@ public boolean uploadEverythingBlocking() { return anything; } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyColorSky.java b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyColorSky.java index e8abe210..33a0284d 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyColorSky.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyColorSky.java @@ -18,13 +18,11 @@ */ @Mixin(WorldRenderer.class) public abstract class Mixin_ChromaKeyColorSky { - @Shadow @Final private Minecraft mc; + @Shadow + @Final + private Minecraft mc; - //#if MC>=11400 || 10710>=MC @Inject(method = "renderSky(Lcom/mojang/blaze3d/matrix/MatrixStack;F)V", at = @At("HEAD"), cancellable = true) - //#else - //$$ @Inject(method = "renderSky(FI)V", at = @At("HEAD"), cancellable = true) - //#endif private void chromaKeyingSky(CallbackInfo ci) { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) this.mc.gameRenderer).replayModRender_getHandler(); if (handler != null) { @@ -32,9 +30,7 @@ private void chromaKeyingSky(CallbackInfo ci) { if (color != null) { GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1); GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT - //#if MC>=11400 , false - //#endif ); ci.cancel(); } diff --git a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyDisableFog.java b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyDisableFog.java index 4780310b..81d84561 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyDisableFog.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyDisableFog.java @@ -12,10 +12,7 @@ public abstract class Mixin_ChromaKeyDisableFog { @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true) private - //#if MC>=11500 - static - //#endif - void replayModRender_onSetupFog(CallbackInfo ci) { + static void replayModRender_onSetupFog(CallbackInfo ci) { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); if (handler == null) return; diff --git a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyForceSky.java b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyForceSky.java index 76afb7a8..0dc6a330 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyForceSky.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ChromaKeyForceSky.java @@ -3,39 +3,24 @@ import com.replaymod.render.hooks.EntityRendererHandler; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.WorldRenderer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; -//#if MC>=11500 -import net.minecraft.client.renderer.WorldRenderer; -//#else -//$$ import net.minecraft.client.render.GameRenderer; -//#endif - /** * Forces the sky to always render when chroma keying is active. Ordinarily it only renders when the render distance is * at 4 or greater. */ -//#if MC>=11500 @Mixin(WorldRenderer.class) -//#else -//$$ @Mixin(GameRenderer.class) -//#endif public abstract class Mixin_ChromaKeyForceSky { - @Shadow @Final private Minecraft mc; + @Shadow + @Final + private Minecraft mc; - //#if MC>=11500 @ModifyConstant(method = "updateCameraAndRender", constant = @Constant(intValue = 4)) - //#else - //#if MC>=11400 - //$$ @ModifyConstant(method = "renderCenter", constant = @Constant(intValue = 4)) - //#else - //$$ @ModifyConstant(method = "updateCameraAndRender(FJ)V", constant = @Constant(intValue = 4)) - //#endif - //#endif private int forceSkyWhenChromaKeying(int value) { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) this.mc.gameRenderer).replayModRender_getHandler(); if (handler != null) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_ChunkRenderWorker.java b/src/main/java/com/replaymod/mixin/Mixin_ChunkRenderWorker.java index 0243772a..e229a285 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ChunkRenderWorker.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ChunkRenderWorker.java @@ -1,45 +1 @@ // FIXME 1.15 -//#if MC>=10800 && MC<11500 -//$$ package com.replaymod.render.blend.mixin; -//$$ -//$$ import com.replaymod.render.blend.BlendState; -//$$ import com.replaymod.render.blend.exporters.ChunkExporter; -//$$ import net.minecraft.client.render.chunk.ChunkRenderWorker; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.injection.At; -//$$ import org.spongepowered.asm.mixin.injection.Inject; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ -//#if MC>=11400 -//$$ import net.minecraft.client.render.chunk.ChunkRenderTask; -//#else -//$$ import net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator; -//#endif -//$$ -//$$ @Mixin(ChunkRenderWorker.class) -//$$ public abstract class MixinChunkRenderWorker { -//$$ -//$$ @Inject(method = "runTask", at = @At("RETURN")) - //#if MC>=11400 - //$$ public void afterChunkUpdate(ChunkRenderTask task, CallbackInfo ci) { - //$$ BlendState blendState = BlendState.getState(); - //$$ if (blendState != null) { - //$$ if (task.getStage() == ChunkRenderTask.Stage.DONE - //$$ && task.getMode() == ChunkRenderTask.Mode.REBUILD_CHUNK) { - //$$ blendState.get(ChunkExporter.class).addChunkUpdate(task.getChunkRenderer(), task.getRenderData()); - //$$ } - //$$ } - //$$ } - //#else - //$$ public void afterChunkUpdate(ChunkCompileTaskGenerator task, CallbackInfo ci) { - //$$ BlendState blendState = BlendState.getState(); - //$$ if (blendState != null) { - //$$ if (task.getStatus() == ChunkCompileTaskGenerator.Status.DONE - //$$ && task.getType() == ChunkCompileTaskGenerator.Type.REBUILD_CHUNK) { - //$$ blendState.get(ChunkExporter.class).addChunkUpdate(task.getRenderChunk(), task.getCompiledChunk()); - //$$ } - //$$ } - //$$ } - //#endif -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_ContextualKeyBindings.java b/src/main/java/com/replaymod/mixin/Mixin_ContextualKeyBindings.java index ec96781c..6afcd3a8 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ContextualKeyBindings.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ContextualKeyBindings.java @@ -11,11 +11,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * We have bunch of keybindings which only have an effect while in a replay but heavily conflict with vanilla ones @@ -24,15 +20,17 @@ */ @Mixin(KeyBinding.class) public class Mixin_ContextualKeyBindings { - //#if MC>=11200 - @Shadow @Final private static Map KEYBIND_ARRAY; - @Unique private static Collection keyBindings() { return Mixin_ContextualKeyBindings.KEYBIND_ARRAY.values(); } - //#else - //$$ @Shadow @Final private static List KEYBIND_ARRAY; - //$$ @Unique private static Collection keyBindings() { return Mixin_ContextualKeyBindings.KEYBIND_ARRAY; } - //#endif + @Shadow + @Final + private static Map KEYBIND_ARRAY; - @Unique private static final List temporarilyRemoved = new ArrayList<>(); + @Unique + private static Collection keyBindings() { + return Mixin_ContextualKeyBindings.KEYBIND_ARRAY.values(); + } + + @Unique + private static final List temporarilyRemoved = new ArrayList<>(); @Inject(method = "resetKeyBindingArrayAndHash", at = @At("HEAD")) private static void preContextualKeyBindings(CallbackInfo ci) { @@ -67,11 +65,7 @@ private static void preContextualKeyBindings(CallbackInfo ci) { @Inject(method = "resetKeyBindingArrayAndHash", at = @At("RETURN")) private static void postContextualKeyBindings(CallbackInfo ci) { for (KeyBinding keyBinding : temporarilyRemoved) { - //#if MC>=11200 Mixin_ContextualKeyBindings.KEYBIND_ARRAY.put(keyBinding.getKeyDescription(), keyBinding); - //#else - //$$ keyBindings().add(keyBinding); - //#endif } temporarilyRemoved.clear(); } diff --git a/src/main/java/com/replaymod/mixin/Mixin_EffectRenderer.java b/src/main/java/com/replaymod/mixin/Mixin_EffectRenderer.java index 566449ca..e69de29b 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_EffectRenderer.java +++ b/src/main/java/com/replaymod/mixin/Mixin_EffectRenderer.java @@ -1,80 +0,0 @@ -//#if MC>=10800 && MC<11500 -//$$ package com.replaymod.render.blend.mixin; -//$$ -//$$ import com.replaymod.render.blend.BlendState; -//$$ import com.replaymod.render.blend.exporters.ParticlesExporter; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.injection.At; -//$$ import org.spongepowered.asm.mixin.injection.Inject; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ -//#if MC>=11400 -//$$ import net.minecraft.client.render.Camera; -//#else -//$$ import net.minecraft.entity.Entity; -//#endif -//$$ -//#if MC>=10904 -//$$ import net.minecraft.client.particle.ParticleManager; -//#else -//$$ import net.minecraft.client.particle.EffectRenderer; -//#endif -//$$ -//#if MC>=10904 -//$$ @Mixin(ParticleManager.class) -//#else -//$$ @Mixin(EffectRenderer.class) -//#endif -//$$ public abstract class MixinEffectRenderer { -//$$ -//$$ @Inject(method = "renderParticles", at = @At("HEAD")) -//$$ private void preRender( - //#if MC>=11400 - //$$ Camera view, - //#else - //$$ Entity view, - //#endif -//$$ float renderPartialTicks, -//$$ CallbackInfo ci -//$$ ) { -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(ParticlesExporter.class).preParticlesRender(false); -//$$ } -//$$ } -//$$ -//$$ @Inject(method = "renderParticles", at = @At("RETURN")) -//$$ private void postRender( - //#if MC>=11400 - //$$ Camera view, - //#else - //$$ Entity view, - //#endif -//$$ float renderPartialTicks, -//$$ CallbackInfo ci -//$$ ) { -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(ParticlesExporter.class).postParticlesRender(); -//$$ } -//$$ } -//$$ - //#if MC<11400 - //$$ @Inject(method = "renderLitParticles", at = @At("HEAD")) - //$$ public void preLitRender(Entity view, float renderPartialTicks, CallbackInfo ci) { - //$$ BlendState blendState = BlendState.getState(); - //$$ if (blendState != null) { - //$$ blendState.get(ParticlesExporter.class).preParticlesRender(true); - //$$ } - //$$ } - //$$ - //$$ @Inject(method = "renderLitParticles", at = @At("RETURN")) - //$$ public void postLitRender(Entity view, float renderPartialTicks, CallbackInfo ci) { - //$$ BlendState blendState = BlendState.getState(); - //$$ if (blendState != null) { - //$$ blendState.get(ParticlesExporter.class).postParticlesRender(); - //$$ } - //$$ } - //#endif -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_EntityLivingBaseAccessor.java b/src/main/java/com/replaymod/mixin/Mixin_EntityLivingBaseAccessor.java index b22b4e5f..c0f98831 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_EntityLivingBaseAccessor.java +++ b/src/main/java/com/replaymod/mixin/Mixin_EntityLivingBaseAccessor.java @@ -6,23 +6,24 @@ @Mixin(LivingEntity.class) public interface Mixin_EntityLivingBaseAccessor { - //#if MC>=11400 @Accessor double getInterpTargetX(); + @Accessor double getInterpTargetY(); + @Accessor double getInterpTargetZ(); + @Accessor double getInterpTargetYaw(); + @Accessor double getInterpTargetPitch(); - //#endif - //#if MC>=10904 @Accessor int getActiveItemStackUseCount(); + @Accessor void setActiveItemStackUseCount(int value); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/Mixin_ForceChunkLoading.java b/src/main/java/com/replaymod/mixin/Mixin_ForceChunkLoading.java index a140bd2c..66e8bd4c 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ForceChunkLoading.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ForceChunkLoading.java @@ -4,9 +4,9 @@ import com.replaymod.render.hooks.ForceChunkLoadingHook; import com.replaymod.render.hooks.IForceChunkLoading; import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.client.renderer.culling.ClippingHelper; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import net.minecraft.client.renderer.culling.ClippingHelper; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -24,17 +24,23 @@ public void replayModRender_setHook(ForceChunkLoadingHook hook) { this.replayModRender_hook = hook; } - @Shadow private Set chunksToUpdate; + @Shadow + private Set chunksToUpdate; - @Shadow private ChunkRenderDispatcher renderDispatcher; + @Shadow + private ChunkRenderDispatcher renderDispatcher; - @Shadow private boolean displayListEntitiesDirty; + @Shadow + private boolean displayListEntitiesDirty; - @Shadow protected abstract void setupTerrain(ActiveRenderInfo camera_1, ClippingHelper frustum_1, boolean boolean_1, int int_1, boolean boolean_2); + @Shadow + protected abstract void setupTerrain(ActiveRenderInfo camera_1, ClippingHelper frustum_1, boolean boolean_1, int int_1, boolean boolean_2); - @Shadow private int frameId; + @Shadow + private int frameId; private boolean passThrough; + @Inject(method = "setupTerrain", at = @At("HEAD"), cancellable = true) private void forceAllChunks(ActiveRenderInfo camera_1, ClippingHelper frustum_1, boolean boolean_1, int int_1, boolean boolean_2, CallbackInfo ci) throws IllegalAccessException { if (replayModRender_hook == null) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_HideDynamicResourcePacks.java b/src/main/java/com/replaymod/mixin/Mixin_HideDynamicResourcePacks.java index 8dc59b4b..e69de29b 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_HideDynamicResourcePacks.java +++ b/src/main/java/com/replaymod/mixin/Mixin_HideDynamicResourcePacks.java @@ -1,37 +0,0 @@ -//#if FABRIC>=1 -//$$ package com.replaymod.mixin; -//$$ -//$$ import net.minecraft.client.gui.screen.pack.PackListWidget; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.injection.At; -//$$ import org.spongepowered.asm.mixin.injection.Inject; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ -//#if MC>=11600 -//$$ import net.minecraft.client.gui.screen.pack.PackScreen; -//$$ import net.minecraft.client.gui.screen.pack.ResourcePackOrganizer; -//#else -//$$ import net.minecraft.client.resource.ClientResourcePackProfile; -//#endif -//$$ -//#if MC>=11600 -//$$ @Mixin(PackScreen.class) -//#else -//$$ @Mixin(ResourcePackListWidget.class) -//#endif -//$$ public abstract class Mixin_HideDynamicResourcePacks { - //#if MC>=11600 - //$$ @Inject(method = "method_29672", at = @At("HEAD"), cancellable = true) - //$$ private void hideInternalPacks(PackListWidget packListWidget, ResourcePackOrganizer.Pack pack, CallbackInfo info) { - //#else - //$$ @Inject(method = "add", at = @At("HEAD"), cancellable = true) - //$$ private void hideInternalPacks(ResourcePackListWidget.ResourcePackEntry entry, CallbackInfo info) { - //$$ ClientResourcePackProfile pack = entry.getPack(); - //#endif -//$$ String name = pack.getDisplayName().asString(); -//$$ if (name.equals("replaymod_lang") || name.equals("replaymod_jgui")) { -//$$ info.cancel(); -//$$ } -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_HideNameTags.java b/src/main/java/com/replaymod/mixin/Mixin_HideNameTags.java index fbdd1b79..1fde651e 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_HideNameTags.java +++ b/src/main/java/com/replaymod/mixin/Mixin_HideNameTags.java @@ -10,15 +10,7 @@ @Mixin(EntityRenderer.class) public abstract class Mixin_HideNameTags { - //#if MC>=11500 @Inject(method = "renderName", at = @At("HEAD"), cancellable = true) - //#else - //#if MC>=11400 - //$$ @Inject(method = "renderLabel(Lnet/minecraft/entity/Entity;Ljava/lang/String;DDDI)V", at = @At("HEAD"), cancellable = true) - //#else - //$$ @Inject(method = "renderLivingLabel", at = @At("HEAD"), cancellable = true) - //#endif - //#endif private void replayModRender_areAllNamesHidden(CallbackInfo ci) { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); if (handler != null && !handler.getSettings().isRenderNameTags()) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_KeyboardListener.java b/src/main/java/com/replaymod/mixin/Mixin_KeyboardListener.java index bd5ab242..69f5abd4 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_KeyboardListener.java +++ b/src/main/java/com/replaymod/mixin/Mixin_KeyboardListener.java @@ -2,40 +2,19 @@ import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots; import com.replaymod.replay.ReplayModReplay; +import net.minecraft.client.KeyboardListener; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#if MC>=11400 -import net.minecraft.client.KeyboardListener; -//#else -//$$ import net.minecraft.client.Minecraft; -//#endif - -//#if MC>=11400 @Mixin(KeyboardListener.class) -//#else -//$$ @Mixin(Minecraft.class) -//#endif public abstract class Mixin_KeyboardListener { @Inject( - //#if MC>=11400 method = "onKeyEvent", - //#else - //$$ method = "dispatchKeypresses", - //#endif at = @At( value = "INVOKE", - //#if MC>=11400 target = "Lnet/minecraft/util/ScreenShotHelper;saveScreenshot(Ljava/io/File;IILnet/minecraft/client/shader/Framebuffer;Ljava/util/function/Consumer;)V" - //#else - //#if MC>=11400 - //$$ target = "Lnet/minecraft/util/ScreenShotHelper;saveScreenshot(Ljava/io/File;IILnet/minecraft/client/shader/Framebuffer;Ljava/util/function/Consumer;)V" - //#else - //$$ target = "Lnet/minecraft/util/ScreenShotHelper;saveScreenshot(Ljava/io/File;IILnet/minecraft/client/shader/Framebuffer;)Lnet/minecraft/util/text/ITextComponent;" - //#endif - //#endif ), cancellable = true ) diff --git a/src/main/java/com/replaymod/mixin/Mixin_MoveRealmsButton.java b/src/main/java/com/replaymod/mixin/Mixin_MoveRealmsButton.java index 829b89c7..04b8c8e6 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_MoveRealmsButton.java +++ b/src/main/java/com/replaymod/mixin/Mixin_MoveRealmsButton.java @@ -1,4 +1,3 @@ -//#if MC>=11600 package com.replaymod.mixin; import com.replaymod.core.ReplayMod; @@ -24,4 +23,3 @@ private int adjustRealmsButton(int height) { return height; } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_DisableFrustumCulling.java b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_DisableFrustumCulling.java index 41c1cae7..b9753ee2 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_DisableFrustumCulling.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_DisableFrustumCulling.java @@ -2,28 +2,15 @@ import com.replaymod.core.versions.MCVer; import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.renderer.culling.ClippingHelper; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#if MC>=10800 -import net.minecraft.client.renderer.culling.ClippingHelper; -//#else -//$$ import net.minecraft.client.renderer.culling.Frustrum; -//#endif - -//#if MC>=10800 @Mixin(ClippingHelper.class) -//#else -//$$ @Mixin(Frustrum.class) -//#endif public abstract class Mixin_Omnidirectional_DisableFrustumCulling { - //#if MC>=11500 @Inject(method = "isBoxInFrustumRaw", at = @At("HEAD"), cancellable = true) - //#else - //$$ @Inject(method = "intersects", at = @At("HEAD"), cancellable = true) - //#endif public void intersects(CallbackInfoReturnable ci) { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); if (handler != null && handler.omnidirectional) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Rotation.java b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Rotation.java index 77844024..b9ff56ef 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Rotation.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_Rotation.java @@ -1,50 +1,27 @@ package com.replaymod.mixin; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.render.capturer.CubicOpenGlFrameCapturer; import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.util.math.vector.Vector3f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#if MC>=11500 -import com.mojang.blaze3d.matrix.MatrixStack; -import net.minecraft.util.math.vector.Vector3f; -//#else -//$$ import org.lwjgl.opengl.GL11; -//#endif - import static com.replaymod.core.versions.MCVer.getMinecraft; -//#if MC>=11500 @Mixin(value = net.minecraft.client.renderer.GameRenderer.class) -//#else -//#if MC>=11400 -//$$ @Mixin(value = net.minecraft.client.render.Camera.class) -//#else -//$$ @Mixin(value = net.minecraft.client.renderer.EntityRenderer.class) -//#endif -//#endif public abstract class Mixin_Omnidirectional_Rotation { private EntityRendererHandler getHandler() { return ((EntityRendererHandler.IEntityRenderer) getMinecraft().gameRenderer).replayModRender_getHandler(); } - //#if MC>=11500 @Inject(method = "renderWorld", at = @At("HEAD")) - //#else - //#if MC>=11400 - //$$ @Inject(method = "update", at = @At("HEAD")) - //#else - //$$ @Inject(method = "orientCamera", at = @At("HEAD")) - //#endif - //#endif private void replayModRender_setupCubicFrameRotation( - //#if MC>=11500 float partialTicks, long frameStartNano, MatrixStack matrixStack, - //#endif CallbackInfo ci ) { if (getHandler() != null && getHandler().data instanceof CubicOpenGlFrameCapturer.Data) { @@ -78,21 +55,7 @@ private void replayModRender_setupCubicFrameRotation( x = 1; break; } - //#if MC>=11500 matrixStack.rotate(new Vector3f(x, y, 0).rotationDegrees(angle)); - //#else - //$$ GL11.glRotatef(angle, x, y, 0); - //#endif } - //#if MC<11500 - //$$ if (getHandler() != null && getHandler().omnidirectional) { - //$$ // Minecraft goes back a little so we have to revert that - //#if MC>=11400 - //$$ GL11.glTranslatef(0.0F, 0.0F, -0.05F); - //#else - //$$ GL11.glTranslatef(0.0F, 0.0F, 0.1F); - //#endif - //$$ } - //#endif } } diff --git a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_SkipHand.java b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_SkipHand.java index 7ed371a3..e6d13fbc 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_SkipHand.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Omnidirectional_SkipHand.java @@ -1,9 +1,9 @@ package com.replaymod.mixin; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.GameRenderer; -import com.mojang.blaze3d.matrix.MatrixStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -13,16 +13,9 @@ public abstract class Mixin_Omnidirectional_SkipHand implements EntityRendererHandler.IEntityRenderer { @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) private void replayModRender_renderSpectatorHand( - //#if MC>=11500 MatrixStack matrixStack, - //#endif - //#if MC>=11400 ActiveRenderInfo camera, - //#endif float partialTicks, - //#if MC<11400 - //$$ int renderPass, - //#endif CallbackInfo ci ) { EntityRendererHandler handler = replayModRender_getHandler(); diff --git a/src/main/java/com/replaymod/mixin/Mixin_ParticleManager.java b/src/main/java/com/replaymod/mixin/Mixin_ParticleManager.java index 8089abe3..1259843e 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ParticleManager.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ParticleManager.java @@ -1,8 +1,8 @@ package com.replaymod.mixin; -//#if MC>=10904 import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleManager; +import net.minecraft.client.world.ClientWorld; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -10,17 +10,12 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#if MC>=11600 -import net.minecraft.client.world.ClientWorld; -//#else -//$$ import net.minecraft.world.World; -//#endif - import java.util.Queue; @Mixin(ParticleManager.class) public abstract class Mixin_ParticleManager { - @Final @Shadow + @Final + @Shadow private Queue queue; /** @@ -29,17 +24,12 @@ public abstract class Mixin_ParticleManager { * the last tick in the previous world. * * @param world The new world - * @param ci Callback info + * @param ci Callback info */ @Inject(method = "clearEffects", at = @At("HEAD")) public void replayModReplay_clearParticleQueue( - //#if MC>=11600 ClientWorld world, - //#else - //$$ World world, - //#endif CallbackInfo ci) { this.queue.clear(); } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_PlayerControllerMP.java b/src/main/java/com/replaymod/mixin/Mixin_PlayerControllerMP.java index 9a9ed64f..360beaff 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_PlayerControllerMP.java +++ b/src/main/java/com/replaymod/mixin/Mixin_PlayerControllerMP.java @@ -3,40 +3,18 @@ import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.multiplayer.PlayerController; import net.minecraft.client.network.play.ClientPlayNetHandler; +import net.minecraft.client.util.ClientRecipeBook; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.stats.StatisticsManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#if MC>=11400 -import net.minecraft.client.world.ClientWorld; -//#else -//$$ import net.minecraft.world.World; -//#endif - -//#if MC>=11200 -//#if MC>=11400 -import net.minecraft.client.util.ClientRecipeBook; -//#else -//$$ import net.minecraft.stats.RecipeBook; -//#endif -//#endif -//#if MC>=10904 -import net.minecraft.stats.StatisticsManager; -//#else -//$$ import net.minecraft.stats.StatFileWriter; -//#endif - -//#if MC>=10800 -import net.minecraft.client.entity.player.ClientPlayerEntity; -//#else -//$$ import net.minecraft.client.entity.EntityClientPlayerMP; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#endif - @Mixin(PlayerController.class) public abstract class Mixin_PlayerControllerMP { @@ -44,96 +22,28 @@ public abstract class Mixin_PlayerControllerMP { private Minecraft mc; @Shadow - //#if MC>=10904 private ClientPlayNetHandler connection; - //#else - //$$ private NetHandlerPlayClient netClientHandler; - //#endif - //#if MC>=11400 - //#if MC>=11602 - @Inject(method = "createPlayer(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/stats/StatisticsManager;Lnet/minecraft/client/util/ClientRecipeBook;ZZ)Lnet/minecraft/client/entity/player/ClientPlayerEntity;", at=@At("HEAD"), cancellable = true) - //#else - //$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true) - //#endif + @Inject(method = "createPlayer(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/stats/StatisticsManager;Lnet/minecraft/client/util/ClientRecipeBook;ZZ)Lnet/minecraft/client/entity/player/ClientPlayerEntity;", at = @At("HEAD"), cancellable = true) private void replayModReplay_createReplayCamera( - //#if MC>=11400 ClientWorld worldIn, - //#else - //$$ World worldIn, - //#endif StatisticsManager statisticsManager, ClientRecipeBook recipeBookClient, - //#if MC>=11600 boolean lastIsHoldingSneakKey, boolean lastSprinting, - //#endif CallbackInfoReturnable ci ) { if (ReplayModReplay.instance.getReplayHandler() != null) { ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.connection, statisticsManager, recipeBookClient)); - //#else - //#if MC>=11200 - //$$ @Inject(method = "func_192830_a", at=@At("HEAD"), cancellable = true) - //$$ private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, RecipeBook recipeBook, CallbackInfoReturnable ci) { - //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { - //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.connection, statisticsManager, recipeBook)); - //#else - //#if MC>=10904 - //$$ @Inject(method = "createClientPlayer", at=@At("HEAD"), cancellable = true) - //$$ private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, CallbackInfoReturnable ci) { - //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { - //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.connection, statisticsManager)); - //#else - //#if MC>=10800 - //$$ @Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true) - //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { - //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { - //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.netClientHandler, statFileWriter)); - //#else - //$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true) - //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { - //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { - //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.mc.getSession(), this.netClientHandler, statFileWriter)); - //#endif - //#endif - //#endif - //#endif ci.cancel(); } } - //#if MC>=10800 - //#if MC>=11400 - @Inject(method = "isSpectatorMode", at=@At("HEAD"), cancellable = true) - //#else - //$$ @Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true) - //#endif + @Inject(method = "isSpectatorMode", at = @At("HEAD"), cancellable = true) private void replayModReplay_isSpectator(CallbackInfoReturnable ci) { if (this.mc.player instanceof CameraEntity) { // this check should in theory not be required ci.setReturnValue(this.mc.player.isSpectator()); } } - //#endif - //#if MC<=10710 - //$$ // Prevent the disconnect GUI from being opened during the short time when the replay is restarted - //$$ // at which the old network manager is closed but still getting ticked (hence the disconnect GUI opening). - //$$ @Inject(method = "updateController", at = @At("HEAD"), cancellable = true) - //$$ private void replayModReplay_onlyTickNeverDisconnect(CallbackInfo ci) { - //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { - //$$ if (netClientHandler.getNetworkManager().isChannelOpen()) { - //$$ netClientHandler.getNetworkManager().processReceivedPackets(); - //$$ } - //$$ ci.cancel(); - //$$ } - //$$ } - //$$ - //$$ @Inject(method = "resetBlockRemoving", at = @At("HEAD"), cancellable = true) - //$$ private void replayModReplay_skipWorldTick(CallbackInfo ci) { - //$$ if (this.mc.theWorld == null) { - //$$ ci.cancel(); - //$$ } - //$$ } - //#endif } diff --git a/src/main/java/com/replaymod/mixin/Mixin_RegisterDynamicResourcePacks.java b/src/main/java/com/replaymod/mixin/Mixin_RegisterDynamicResourcePacks.java index 550dcf70..e69de29b 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RegisterDynamicResourcePacks.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RegisterDynamicResourcePacks.java @@ -1,56 +0,0 @@ -//#if FABRIC>=1 -//$$ package com.replaymod.mixin; -//$$ -//$$ import com.replaymod.core.ReplayMod; -//$$ import com.replaymod.core.versions.LangResourcePack; -//$$ import net.minecraft.client.resource.ClientBuiltinResourcePackProvider; -//$$ import net.minecraft.resource.ResourcePackProfile; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.injection.At; -//$$ import org.spongepowered.asm.mixin.injection.Inject; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ -//$$ import java.util.function.Consumer; -//$$ -//#if MC>=11600 -//$$ import net.minecraft.resource.ResourcePackSource; -//#else -//$$ import java.util.Map; -//#endif -//$$ -//$$ @Mixin(ClientBuiltinResourcePackProvider.class) -//$$ public class Mixin_RegisterDynamicResourcePacks { -//$$ @Inject(method = "register", at = @At("RETURN")) - //#if MC>=11600 - //$$ private void registerReplayMod(Consumer consumer, ResourcePackProfile.Factory factory, CallbackInfo ci) { - //#else - //$$ private void registerReplayMod(Map map, ResourcePackProfile.Factory factory, CallbackInfo ci) { - //$$ Consumer consumer = (pack) -> map.put(pack.getName(), pack); - //#endif -//$$ -//$$ consumer.accept(ResourcePackProfile.of( -//$$ LangResourcePack.NAME, -//$$ true, -//$$ LangResourcePack::new, -//$$ factory, -//$$ ResourcePackProfile.InsertionPosition.BOTTOM - //#if MC>=11600 - //$$ , ResourcePackSource.PACK_SOURCE_BUILTIN - //#endif -//$$ )); -//$$ -//$$ if (ReplayMod.jGuiResourcePack != null) { -//$$ consumer.accept(ResourcePackProfile.of( -//$$ ReplayMod.JGUI_RESOURCE_PACK_NAME, -//$$ true, -//$$ () -> ReplayMod.jGuiResourcePack, -//$$ factory, -//$$ ResourcePackProfile.InsertionPosition.BOTTOM - //#if MC>=11600 - //$$ , ResourcePackSource.PACK_SOURCE_BUILTIN - //#endif -//$$ )); -//$$ } -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderGlobal.java b/src/main/java/com/replaymod/mixin/Mixin_RenderGlobal.java index 7bab3856..32f8fb1b 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderGlobal.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderGlobal.java @@ -1,52 +1,19 @@ -//#if MC>=10800 package com.replaymod.mixin; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.EntityExporter; -import com.replaymod.render.blend.exporters.TileEntityExporter; +import net.minecraft.client.renderer.WorldRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#if MC>=11500 -import net.minecraft.client.renderer.culling.ClippingHelper; -//#else -//$$ import net.minecraft.client.render.VisibleRegion; -//#endif - -//#if MC>=11400 -import net.minecraft.client.renderer.ActiveRenderInfo; -//#else -//$$ import net.minecraft.entity.Entity; -//#endif - -//#if MC>=11400 -import net.minecraft.client.renderer.WorldRenderer; -//#else -//$$ import net.minecraft.client.renderer.RenderGlobal; -//#endif - -//#if MC>=11400 @Mixin(WorldRenderer.class) -//#else -//$$ @Mixin(RenderGlobal.class) -//#endif public abstract class Mixin_RenderGlobal { // FIXME wither skull ._. mojang pls - //#if MC>=11500 @Inject(method = "renderEntity", at = @At("HEAD")) - //#else - //$$ @Inject(method = "renderEntities", - //$$ at = @At(value = "INVOKE", - //#if MC>=10904 - //$$ target = "Lnet/minecraft/client/render/entity/EntityRenderDispatcher;render(Lnet/minecraft/entity/Entity;FZ)V")) - //#else - //$$ target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)Z")) - //#endif - //#endif private void preEntityRender(CallbackInfo ci) { BlendState blendState = BlendState.getState(); if (blendState != null) { @@ -54,18 +21,7 @@ private void preEntityRender(CallbackInfo ci) { } } - //#if MC>=11500 @Inject(method = "renderEntity", at = @At("RETURN")) - //#else - //$$ @Inject(method = "renderEntities", - //$$ at = @At(value = "INVOKE", - //#if MC>=10904 - //$$ target = "Lnet/minecraft/client/render/entity/EntityRenderDispatcher;render(Lnet/minecraft/entity/Entity;FZ)V", - //#else - //$$ target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)Z", - //#endif - //$$ shift = At.Shift.AFTER)) - //#endif private void postEntityRender(CallbackInfo ci) { BlendState blendState = BlendState.getState(); if (blendState != null) { @@ -73,39 +29,5 @@ private void postEntityRender(CallbackInfo ci) { } } - //#if MC>=11500 // FIXME - //#else - //$$ @Inject(method = "renderEntities", at = @At( - //$$ value = "INVOKE", - //#if MC>=11400 - //$$ target = "Lnet/minecraft/client/render/block/entity/BlockEntityRenderDispatcher;render(Lnet/minecraft/block/entity/BlockEntity;FI)V" - //#else - //$$ target = "Lnet/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher;renderTileEntity(Lnet/minecraft/tileentity/TileEntity;FI)V" - //#endif - //$$ )) - //$$ private void preTileEntityRender(CallbackInfo ci) { - //$$ BlendState blendState = BlendState.getState(); - //$$ if (blendState != null) { - //$$ blendState.get(TileEntityExporter.class).preTileEntitiesRender(); - //$$ } - //$$ } - //$$ - //$$ @Inject(method = "renderEntities", at = @At( - //$$ value = "INVOKE", - //#if MC>=11400 - //$$ target = "Lnet/minecraft/client/render/block/entity/BlockEntityRenderDispatcher;render(Lnet/minecraft/block/entity/BlockEntity;FI)V", - //#else - //$$ target = "Lnet/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher;renderTileEntity(Lnet/minecraft/tileentity/TileEntity;FI)V", - //#endif - //$$ shift = At.Shift.AFTER - //$$ )) - //$$ private void postTileEntityRender(CallbackInfo ci) { - //$$ BlendState blendState = BlendState.getState(); - //$$ if (blendState != null) { - //$$ blendState.get(TileEntityExporter.class).postTileEntitiesRender(); - //$$ } - //$$ } - //#endif } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderHudCallback.java b/src/main/java/com/replaymod/mixin/Mixin_RenderHudCallback.java index d1adca1c..e69de29b 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderHudCallback.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderHudCallback.java @@ -1,32 +0,0 @@ -//#if FABRIC>=1 -//$$ package com.replaymod.mixin; -//$$ -//$$ import com.replaymod.gui.versions.callbacks.RenderHudCallback; -//$$ import net.minecraft.client.gui.hud.InGameHud; -//$$ import net.minecraft.client.util.math.MatrixStack; -//$$ import org.objectweb.asm.Opcodes; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.injection.At; -//$$ import org.spongepowered.asm.mixin.injection.Inject; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ -//$$ @Mixin(InGameHud.class) -//$$ public class Mixin_RenderHudCallback { -//$$ @Inject( -//$$ method = "render", -//$$ at = @At( -//$$ value = "FIELD", -//$$ opcode = Opcodes.GETFIELD, -//$$ target = "Lnet/minecraft/client/options/GameOptions;debugEnabled:Z" -//$$ ) -//$$ ) - //#if MC>=11600 - //$$ private void renderOverlay(MatrixStack stack, float partialTicks, CallbackInfo ci) { - //#else - //$$ private void renderOverlay(float partialTicks, CallbackInfo ci) { - //$$ MatrixStack stack = new MatrixStack(); - //#endif -//$$ RenderHudCallback.EVENT.invoker().renderHud(stack, partialTicks); -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderItem.java b/src/main/java/com/replaymod/mixin/Mixin_RenderItem.java index 9be66cac..42d95564 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderItem.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderItem.java @@ -2,45 +2,19 @@ import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; +import net.minecraft.util.Util; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -//#if MC>=11400 -import net.minecraft.util.Util; -//#else -//$$ import net.minecraft.client.Minecraft; -//#endif - -//#if MC>=11500 @Mixin(net.minecraft.client.renderer.RenderState.class) -//#else -//$$ @Mixin(net.minecraft.client.render.item.ItemRenderer.class) -//#endif public class Mixin_RenderItem { - //#if MC>=11400 - //#if MC>=11500 @Redirect(method = "setupGlintTexturing", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;milliTime()J")) - //#else - //#if MC>=11400 - //$$ @Redirect(method = "renderGlint", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;getMeasuringTimeMs()J")) - //#else - //$$ @Redirect(method = "renderEffect", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;milliTime()J")) - //#endif - //#endif private static long getEnchantmentTime() { - //#else - //$$ @Redirect(method = "renderEffect", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) - //$$ private long getEnchantmentTime() { - //#endif ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); if (replayHandler != null) { return replayHandler.getReplaySender().currentTimeStamp(); } - //#if MC>=11400 return Util.milliTime(); - //#else - //$$ return Minecraft.getSystemTime(); - //#endif } } diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderLivingBase.java b/src/main/java/com/replaymod/mixin/Mixin_RenderLivingBase.java index f6b2227e..8f023ee0 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderLivingBase.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderLivingBase.java @@ -1,6 +1,7 @@ package com.replaymod.mixin; import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.renderer.entity.LivingRenderer; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import org.spongepowered.asm.mixin.Mixin; @@ -9,25 +10,11 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#if MC>=10904 -import net.minecraft.client.renderer.entity.LivingRenderer; -//#else -//$$ import net.minecraft.client.renderer.entity.RendererLivingEntity; -//#endif - -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.getMinecraft; -//#if MC>=10904 @Mixin(LivingRenderer.class) -//#else -//$$ @Mixin(RendererLivingEntity.class) -//#endif public abstract class Mixin_RenderLivingBase { - //#if FABRIC>=1 - //$$ @Inject(method = "hasLabel", at = @At("HEAD"), cancellable = true) - //#else @Inject(method = "canRenderName(Lnet/minecraft/entity/LivingEntity;)Z", at = @At("HEAD"), cancellable = true) - //#endif private void replayModReplay_canRenderInvisibleName(LivingEntity entity, CallbackInfoReturnable ci) { PlayerEntity thePlayer = getMinecraft().player; if (thePlayer instanceof CameraEntity && entity.isInvisible()) { @@ -36,18 +23,10 @@ private void replayModReplay_canRenderInvisibleName(LivingEntity entity, Callbac } @Redirect( - //#if MC>=11500 method = "render", - //#else - //$$ method = "render(Lnet/minecraft/entity/LivingEntity;FFFFFF)V", - //#endif at = @At( value = "INVOKE", - //#if MC>=11400 target = "Lnet/minecraft/entity/LivingEntity;isInvisibleTo(Lnet/minecraft/entity/player/PlayerEntity;)Z" - //#else - //$$ target = "Lnet/minecraft/entity/EntityLivingBase;isInvisibleToPlayer(Lnet/minecraft/entity/player/EntityPlayer;)Z" - //#endif ) ) private boolean replayModReplay_shouldInvisibleNotBeRendered(LivingEntity entity, PlayerEntity thePlayer) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_RenderManager.java b/src/main/java/com/replaymod/mixin/Mixin_RenderManager.java index fd57653e..44b19da9 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_RenderManager.java +++ b/src/main/java/com/replaymod/mixin/Mixin_RenderManager.java @@ -1,61 +1,28 @@ -//#if MC>=10800 package com.replaymod.mixin; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.EntityExporter; +import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.entity.EntityRendererManager; 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; - -//#if MC>=11500 -import net.minecraft.client.renderer.IRenderTypeBuffer; -import com.mojang.blaze3d.matrix.MatrixStack; -//#endif - -//#if MC>=10904 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#else -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#endif @Mixin(EntityRendererManager.class) public abstract class Mixin_RenderManager { @Inject( - //#if MC>=11500 method = "renderEntityStatic", - //#else - //#if MC>=11400 && FABRIC>=1 - //$$ method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", - //#else - //#if MC>=11400 - //$$ method = "renderEntity", - //#else - //$$ method = "doRenderEntity", - //#endif - //#endif - //#endif at = @At(value = "INVOKE", - //#if MC>=11500 - target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;FFLcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;I)V")) - //#else - //$$ target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;DDDFF)V")) - //#endif + target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;FFLcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;I)V")) public void preRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, - //#if MC>=11500 MatrixStack matrixStack, IRenderTypeBuffer vertexConsumerProvider, int int_1, - //#else - //$$ boolean box, - //#endif - //#if MC>=10904 CallbackInfo ci) { - //#else - //$$ CallbackInfoReturnable ci) { - //#endif BlendState blendState = BlendState.getState(); if (blendState != null) { blendState.get(EntityExporter.class).preRender(entity, x, y, z, yaw, renderPartialTicks); @@ -63,43 +30,18 @@ public void preRender(Entity entity, double x, double y, double z, float yaw, fl } @Inject( - //#if MC>=11500 method = "renderEntityStatic", - //#else - //#if MC>=11400 - //$$ method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", - //#else - //#if MC>=11400 - //$$ method = "renderEntity", - //#else - //$$ method = "doRenderEntity", - //#endif - //#endif - //#endif at = @At(value = "INVOKE", - //#if MC>=11500 - target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;FFLcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;I)V", - //#else - //$$ target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;DDDFF)V", - //#endif - shift = At.Shift.AFTER)) + target = "Lnet/minecraft/client/renderer/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;FFLcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;I)V", + shift = At.Shift.AFTER)) public void postRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, - //#if MC>=11500 MatrixStack matrixStack, IRenderTypeBuffer vertexConsumerProvider, int int_1, - //#else - //$$ boolean box, - //#endif - //#if MC>=10904 CallbackInfo ci) { - //#else - //$$ CallbackInfoReturnable ci) { - //#endif BlendState blendState = BlendState.getState(); if (blendState != null) { blendState.get(EntityExporter.class).postRender(entity, x, y, z, yaw, renderPartialTicks); } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_NoOF.java b/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_NoOF.java index 5da966a3..519ba923 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_NoOF.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_NoOF.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.mixin; import com.replaymod.replay.camera.CameraEntity; @@ -30,4 +29,3 @@ private GameType getGameMode(PlayerController interactionManager) { return interactionManager.getCurrentGameType(); } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_OF.java b/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_OF.java index b90aa9d2..8ae6a114 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_OF.java +++ b/src/main/java/com/replaymod/mixin/Mixin_ShowSpectatedHand_OF.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.mixin; import com.replaymod.replay.camera.CameraEntity; @@ -39,4 +38,3 @@ private static void fakePlayerGameMode(boolean renderingHand, CallbackInfo ci) { } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_SkipBlockOutlinesDuringRender.java b/src/main/java/com/replaymod/mixin/Mixin_SkipBlockOutlinesDuringRender.java index e9396919..478b6abd 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_SkipBlockOutlinesDuringRender.java +++ b/src/main/java/com/replaymod/mixin/Mixin_SkipBlockOutlinesDuringRender.java @@ -12,7 +12,9 @@ @Mixin(WorldRenderer.class) public abstract class Mixin_SkipBlockOutlinesDuringRender { - @Shadow @Final private Minecraft mc; + @Shadow + @Final + private Minecraft mc; @Inject(method = "drawSelectionBox", at = @At("HEAD"), cancellable = true) private void replayModRender_drawSelectionBox(CallbackInfo ci) { diff --git a/src/main/java/com/replaymod/mixin/Mixin_StabilizeCamera.java b/src/main/java/com/replaymod/mixin/Mixin_StabilizeCamera.java index f6d0b4d0..0551a0ac 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_StabilizeCamera.java +++ b/src/main/java/com/replaymod/mixin/Mixin_StabilizeCamera.java @@ -3,27 +3,18 @@ import com.replaymod.render.RenderSettings; import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +import net.minecraft.world.IBlockReader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static com.replaymod.core.versions.MCVer.*; - -//#if MC>=11400 -import net.minecraft.client.renderer.ActiveRenderInfo; -import net.minecraft.world.IBlockReader; -//#else -//$$ import net.minecraft.client.renderer.EntityRenderer; -//#endif +import static com.replaymod.core.versions.MCVer.getMinecraft; -//#if MC>=11400 @Mixin(value = ActiveRenderInfo.class) -//#else -//$$ @Mixin(value = EntityRenderer.class) -//#endif public abstract class Mixin_StabilizeCamera { private EntityRendererHandler getHandler() { return ((EntityRendererHandler.IEntityRenderer) getMinecraft().gameRenderer).replayModRender_getHandler(); @@ -39,28 +30,16 @@ private EntityRendererHandler getHandler() { private float orgHeadYaw; private float orgPrevHeadYaw; - //#if MC>=11400 @Inject(method = "update", at = @At("HEAD")) - //#else - //$$ @Inject(method = "setupCameraTransform", at = @At("HEAD")) - //#endif private void replayModRender_beforeSetupCameraTransform( - //#if MC>=11400 IBlockReader blockView, Entity entity, boolean thirdPerson, boolean inverseView, - //#endif float partialTicks, - //#if MC<11400 - //$$ int renderPass, - //#endif CallbackInfo ci ) { if (getHandler() != null) { - //#if MC<11400 - //$$ Entity entity = getMinecraft().getRenderViewEntity(); - //#endif orgYaw = entity.rotationYaw; orgPitch = entity.rotationPitch; orgPrevYaw = entity.prevRotationYaw; @@ -71,16 +50,7 @@ private void replayModRender_beforeSetupCameraTransform( orgPrevHeadYaw = ((LivingEntity) entity).prevRotationYawHead; } } - //#if MC<11400 - //$$ } - //$$ - //$$ @Inject(method = "orientCamera", at = @At("HEAD")) - //$$ private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) { - //#endif if (getHandler() != null) { - //#if MC<11400 - //$$ Entity entity = getMinecraft().getRenderViewEntity(); - //#endif RenderSettings settings = getHandler().getSettings(); if (settings.isStabilizeYaw()) { entity.prevRotationYaw = entity.rotationYaw = 0; @@ -97,28 +67,16 @@ private void replayModRender_beforeSetupCameraTransform( } } - //#if MC>=11400 @Inject(method = "update", at = @At("RETURN")) - //#else - //$$ @Inject(method = "setupCameraTransform", at = @At("RETURN")) - //#endif private void replayModRender_afterSetupCameraTransform( - //#if MC>=11400 IBlockReader blockView, Entity entity, boolean thirdPerson, boolean inverseView, - //#endif float partialTicks, - //#if MC<11400 - //$$ int renderPass, - //#endif CallbackInfo ci ) { if (getHandler() != null) { - //#if MC<11400 - //$$ Entity entity = getMinecraft().getRenderViewEntity(); - //#endif entity.rotationYaw = orgYaw; entity.rotationPitch = orgPitch; entity.prevRotationYaw = orgPrevYaw; diff --git a/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_Camera.java b/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_Camera.java index 9994e321..87d0879c 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_Camera.java +++ b/src/main/java/com/replaymod/mixin/Mixin_Stereoscopic_Camera.java @@ -1,9 +1,9 @@ package com.replaymod.mixin; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.renderer.GameRenderer; -import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.util.math.vector.Matrix4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/com/replaymod/mixin/Mixin_WindowsWorkaroundForTinyEXRNatives.java b/src/main/java/com/replaymod/mixin/Mixin_WindowsWorkaroundForTinyEXRNatives.java index 80a146a3..41fb57ea 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_WindowsWorkaroundForTinyEXRNatives.java +++ b/src/main/java/com/replaymod/mixin/Mixin_WindowsWorkaroundForTinyEXRNatives.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.mixin; import org.lwjgl.system.Library; @@ -23,13 +22,13 @@ * It appears like natives on Windows cannot be loaded if one of their dependencies has already been loaded by a * different class loader. In our case we cannot load tinyexr (on the knot class loader) because lwjgl has already * been loaded on the system class loader. - * + *

* If we force the tinyexr native to load on the system class loader (by calling `Library.loadSystem(absPath)`), * it'll load but we'll get an error when we call any of the native methods. - * + *

* We can't really load TinyEXR itself via the system class loader because Java does not provide any methods for * modifying the system class path at runtime and we'd have to use JVM-specific hacks. - * + *

* Strangely, if we use System.loadLibrary instead of System.load, then it all just works. This mixin implements * that workaround by finding MC's natives folder, extracting the dll from our jar into that folder and then replacing * the context class passed to Library.loadSystem (which it uses to find dlls in jars) with Library (which is on the @@ -78,4 +77,3 @@ private static Class uglyWindowsHacks(Consumer load, Consumer return Library.class; } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/Mixin_WorldRendererAccessor.java b/src/main/java/com/replaymod/mixin/Mixin_WorldRendererAccessor.java index 75c5f846..e229a285 100644 --- a/src/main/java/com/replaymod/mixin/Mixin_WorldRendererAccessor.java +++ b/src/main/java/com/replaymod/mixin/Mixin_WorldRendererAccessor.java @@ -1,16 +1 @@ // FIXME 1.15 -//#if MC>=10800 && MC<11500 -//$$ package com.replaymod.render.blend.mixin; -//$$ -//$$ import net.minecraft.client.render.WorldRenderer; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.gen.Accessor; -//$$ -//$$ import java.util.List; -//$$ -//$$ @Mixin(WorldRenderer.class) -//$$ public interface WorldRendererAccessor { -//$$ @Accessor("chunkInfos") -//$$ List getRenderInfos(); -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/ParticleAccessor.java b/src/main/java/com/replaymod/mixin/ParticleAccessor.java index 27cc3593..3cb701ed 100644 --- a/src/main/java/com/replaymod/mixin/ParticleAccessor.java +++ b/src/main/java/com/replaymod/mixin/ParticleAccessor.java @@ -5,23 +5,22 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(Particle.class) -public interface ParticleAccessor - //#if MC<10904 - //$$ extends EntityAccessor - //#endif -{ - //#if MC>=10904 +public interface ParticleAccessor { @Accessor double getPrevPosX(); + @Accessor double getPrevPosY(); + @Accessor double getPrevPosZ(); + @Accessor double getPosX(); + @Accessor double getPosY(); + @Accessor double getPosZ(); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/SPacketSpawnMobAccessor.java b/src/main/java/com/replaymod/mixin/SPacketSpawnMobAccessor.java index 0954371a..e5120897 100644 --- a/src/main/java/com/replaymod/mixin/SPacketSpawnMobAccessor.java +++ b/src/main/java/com/replaymod/mixin/SPacketSpawnMobAccessor.java @@ -1,16 +1,8 @@ package com.replaymod.mixin; -import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.network.play.server.SSpawnMobPacket; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(SSpawnMobPacket.class) public interface SPacketSpawnMobAccessor { - //#if MC<11500 - //$$ @Accessor("dataTracker") - //$$ DataTracker getDataManager(); - //$$ @Accessor("dataTracker") - //$$ void setDataManager(DataTracker value); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/SPacketSpawnPlayerAccessor.java b/src/main/java/com/replaymod/mixin/SPacketSpawnPlayerAccessor.java index ea2742d7..f812ad13 100644 --- a/src/main/java/com/replaymod/mixin/SPacketSpawnPlayerAccessor.java +++ b/src/main/java/com/replaymod/mixin/SPacketSpawnPlayerAccessor.java @@ -1,16 +1,8 @@ package com.replaymod.mixin; -import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.network.play.server.SSpawnPlayerPacket; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(SSpawnPlayerPacket.class) public interface SPacketSpawnPlayerAccessor { - //#if MC<11500 - //$$ @Accessor("dataTracker") - //$$ DataTracker getDataManager(); - //$$ @Accessor("dataTracker") - //$$ void setDataManager(DataTracker value); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/TimerAccessor.java b/src/main/java/com/replaymod/mixin/TimerAccessor.java index d68c5594..5aa69967 100644 --- a/src/main/java/com/replaymod/mixin/TimerAccessor.java +++ b/src/main/java/com/replaymod/mixin/TimerAccessor.java @@ -8,38 +8,13 @@ public interface TimerAccessor { @Accessor long getLastSyncSysClock(); + @Accessor void setLastSyncSysClock(long value); - //#if MC>=11200 @Accessor float getTickLength(); + @Accessor void setTickLength(float value); - //#else - //$$ @Accessor - //$$ float getTimerSpeed(); - //$$ @Accessor - //$$ void setTimerSpeed(float value); - //$$ @Accessor - //$$ float getTicksPerSecond(); - //$$ @Accessor - //$$ void setTicksPerSecond(float value); - //$$ @Accessor - //$$ double getLastHRTime(); - //$$ @Accessor - //$$ void setLastHRTime(double value); - //$$ @Accessor - //$$ long getLastSyncHRClock(); - //$$ @Accessor - //$$ void setLastSyncHRClock(long value); - //$$ @Accessor - //$$ double getTimeSyncAdjustment(); - //$$ @Accessor - //$$ void setTimeSyncAdjustment(double value); - //$$ @Accessor - //$$ long getCounter(); - //$$ @Accessor - //$$ void setCounter(long value); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/WorldRendererAccessor.java b/src/main/java/com/replaymod/mixin/WorldRendererAccessor.java index 721537a0..6d14f5ed 100644 --- a/src/main/java/com/replaymod/mixin/WorldRendererAccessor.java +++ b/src/main/java/com/replaymod/mixin/WorldRendererAccessor.java @@ -2,39 +2,7 @@ import net.minecraft.client.renderer.WorldRenderer; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Set; - -//#if MC>=10800 -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; - -//#if MC>=11500 -import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.ChunkRender; -//#else -//$$ import net.minecraft.client.render.chunk.ChunkRenderer; -//#endif -//#endif @Mixin(WorldRenderer.class) public interface WorldRendererAccessor { - //#if MC<11500 - //$$ @Accessor("field_4076") - //$$ void setRenderEntitiesStartupCounter(int value); - //$$ - //#if MC>=10800 - //$$ @Accessor("chunkBuilder") - //$$ ChunkBuilder getRenderDispatcher(); - //$$ - //$$ @Accessor("needsTerrainUpdate") - //$$ void setDisplayListEntitiesDirty(boolean value); - //$$ - //$$ @Accessor("chunksToRebuild") - //#if MC>=11500 - //$$ Set getChunksToUpdate(); - //#else - //$$ Set getChunksToUpdate(); - //#endif - //#endif - //#endif } diff --git a/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java b/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java index 37368a75..b8fee1c8 100644 --- a/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java +++ b/src/main/java/com/replaymod/pathing/gui/GuiKeyframeRepository.java @@ -4,22 +4,9 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; -import com.replaymod.render.gui.GuiRenderQueue; -import com.replaymod.render.gui.GuiRenderSettings; -import com.replaymod.replay.ReplayHandler; -import com.replaymod.replay.ReplayModReplay; -import com.replaymod.replaystudio.pathing.PathingRegistry; -import com.replaymod.replaystudio.pathing.path.Path; -import com.replaymod.replaystudio.pathing.path.Timeline; -import com.replaymod.replaystudio.pathing.serialize.TimelineSerialization; -import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; -import com.replaymod.gui.container.AbstractGuiClickableContainer; -import com.replaymod.gui.container.GuiContainer; -import com.replaymod.gui.container.GuiPanel; -import com.replaymod.gui.container.GuiScreen; -import com.replaymod.gui.container.GuiVerticalList; +import com.replaymod.gui.container.*; import com.replaymod.gui.element.GuiButton; import com.replaymod.gui.element.GuiElement; import com.replaymod.gui.element.GuiLabel; @@ -32,6 +19,15 @@ import com.replaymod.gui.popup.GuiYesNoPopup; import com.replaymod.gui.utils.Colors; import com.replaymod.gui.utils.Consumer; +import com.replaymod.render.gui.GuiRenderQueue; +import com.replaymod.render.gui.GuiRenderSettings; +import com.replaymod.replay.ReplayHandler; +import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replaystudio.pathing.PathingRegistry; +import com.replaymod.replaystudio.pathing.path.Path; +import com.replaymod.replaystudio.pathing.path.Timeline; +import com.replaymod.replaystudio.pathing.serialize.TimelineSerialization; +import com.replaymod.replaystudio.replay.ReplayFile; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; @@ -40,12 +36,7 @@ import org.apache.logging.log4j.Logger; import java.io.IOException; -import java.util.ArrayDeque; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static com.replaymod.gui.versions.MCVer.getClipboardString; @@ -186,7 +177,8 @@ public void run() { } catch (Throwable t) { t.printStackTrace(); CrashReport report = CrashReport.makeCrashReport(t, "Copying timeline(s)"); - Utils.error(LOGGER, GuiKeyframeRepository.this, report, () -> {}); + Utils.error(LOGGER, GuiKeyframeRepository.this, report, () -> { + }); } } }).setSize(75, 20).setI18nLabel("replaymod.gui.copy").setDisabled(); diff --git a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java index 75036d17..5384dbd6 100644 --- a/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java +++ b/src/main/java/com/replaymod/pathing/player/AbstractTimelinePlayer.java @@ -6,21 +6,21 @@ import com.google.common.primitives.Longs; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; +import com.replaymod.core.utils.WrappedTimer; +import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.mixin.MinecraftAccessor; import com.replaymod.mixin.TimerAccessor; -import com.replaymod.core.utils.WrappedTimer; 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 com.replaymod.gui.utils.EventRegistrations; import net.minecraft.client.Minecraft; import net.minecraft.util.Timer; import javax.annotation.Nullable; import java.util.Iterator; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.getMinecraft; /** * Plays a timeline. @@ -50,13 +50,13 @@ public ListenableFuture start(Timeline timeline) { Iterator iter = Iterables.concat(Iterables.transform(timeline.getPaths(), new Function>() { - @Nullable - @Override - public Iterable apply(@Nullable Path input) { - assert input != null; - return input.getKeyframes(); - } - })).iterator(); + @Nullable + @Override + public Iterable apply(@Nullable Path input) { + assert input != null; + return input.getKeyframes(); + } + })).iterator(); if (!iter.hasNext()) { lastTimestamp = 0; } else { @@ -81,13 +81,8 @@ public int compare(@Nullable Keyframe left, @Nullable Keyframe right) { //noinspection ConstantConditions TimerAccessor timerA = (TimerAccessor) timer; - //#if MC>=11200 timerA.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK); timer.renderPartialTicks = timer.ticksThisFrame = 0; - //#else - //$$ timer.timerSpeed = 1; - //$$ timer.elapsedPartialTicks = timer.elapsedTicks = 0; - //#endif return future = settableFuture = SettableFuture.create(); } @@ -99,7 +94,10 @@ public boolean isActive() { return future != null && !future.isDone(); } - { on(ReplayTimer.UpdatedCallback.EVENT, this::onTick); } + { + on(ReplayTimer.UpdatedCallback.EVENT, this::onTick); + } + public void onTick() { if (future.isDone()) { MinecraftAccessor mcA = (MinecraftAccessor) mc; diff --git a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java index bfb0a595..2569c43a 100644 --- a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java +++ b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java @@ -8,15 +8,9 @@ * Wrapper around the current timer that prevents the timer from advancing by itself. */ public class ReplayTimer extends WrappedTimer { - //#if MC>=11400 private final Timer state = new Timer(0, 0); - //#else - //$$ private final Timer state = new Timer(0); - //#endif - //#if MC>=11600 public int ticksThisFrame; - //#endif public ReplayTimer(Timer wrapped) { super(wrapped); @@ -24,38 +18,21 @@ public ReplayTimer(Timer wrapped) { @Override // This should be handled by Remap but it isn't (was handled before a9724e3). - //#if MC>=11400 - public - //#if MC>=11600 - int - //#else - //$$ void - //#endif + public int getPartialTicks( - //#else - //$$ public void updateTimer( - //#endif - //#if MC>=11400 long sysClock - //#endif ) { copy(this, state); // Save our current state try { - //#if MC>=11600 ticksThisFrame = - //#endif - wrapped.getPartialTicks( - //#if MC>=11400 - sysClock - //#endif - ); // Update current state + wrapped.getPartialTicks( + sysClock + ); // Update current state } finally { copy(state, this); // Restore our old state UpdatedCallback.EVENT.invoker().onUpdate(); } - //#if MC>=11600 return ticksThisFrame; - //#endif } public Timer getWrapped() { @@ -70,6 +47,7 @@ public interface UpdatedCallback { } } ); + void onUpdate(); } } diff --git a/src/main/java/com/replaymod/pathing/properties/CameraProperties.java b/src/main/java/com/replaymod/pathing/properties/CameraProperties.java index b77139cc..d6bc731c 100644 --- a/src/main/java/com/replaymod/pathing/properties/CameraProperties.java +++ b/src/main/java/com/replaymod/pathing/properties/CameraProperties.java @@ -2,6 +2,7 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; +import com.replaymod.gui.utils.NonNull; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replaystudio.pathing.change.Change; @@ -9,7 +10,6 @@ import com.replaymod.replaystudio.pathing.property.AbstractPropertyGroup; import com.replaymod.replaystudio.pathing.property.PropertyPart; import com.replaymod.replaystudio.pathing.property.PropertyParts; -import com.replaymod.gui.utils.NonNull; import org.apache.commons.lang3.tuple.Triple; import java.io.IOException; @@ -25,6 +25,7 @@ public class CameraProperties extends AbstractPropertyGroup { public static final CameraProperties GROUP = new CameraProperties(); public static final Position POSITION = new Position(); public static final Rotation ROTATION = new Rotation(); + private CameraProperties() { super("camera", "replaymod.gui.camera"); } diff --git a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java index 7af16f11..698fff8c 100644 --- a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java +++ b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java @@ -8,7 +8,6 @@ import com.replaymod.replaystudio.pathing.property.PropertyPart; import com.replaymod.replaystudio.pathing.property.PropertyParts; import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; import net.minecraft.world.World; import java.io.IOException; @@ -21,6 +20,7 @@ public class SpectatorProperty extends AbstractProperty { public static final SpectatorProperty PROPERTY = new SpectatorProperty(); public final PropertyPart ENTITY_ID = new PropertyParts.ForInteger(this, false); + private SpectatorProperty() { super("spectate", "replaymod.gui.playeroverview.spectate", null, -1); } @@ -39,13 +39,7 @@ public void applyToGame(Integer value, Object replayHandler) { // Lookup entity by id, returns null if an entity with the id does not exists Entity target = world.getEntityByID(value); // Spectate entity, when called with null, returns to camera - //#if MC>=10800 handler.spectateEntity(target); - //#else - //$$ if (target instanceof EntityLivingBase) { - //$$ handler.spectateEntity(((EntityLivingBase) target)); - //$$ } - //#endif } @Override diff --git a/src/main/java/com/replaymod/pathing/properties/TimestampProperty.java b/src/main/java/com/replaymod/pathing/properties/TimestampProperty.java index 9ac2e5d9..64ca561b 100644 --- a/src/main/java/com/replaymod/pathing/properties/TimestampProperty.java +++ b/src/main/java/com/replaymod/pathing/properties/TimestampProperty.java @@ -2,12 +2,12 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; +import com.replaymod.gui.utils.NonNull; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplaySender; import com.replaymod.replaystudio.pathing.property.AbstractProperty; import com.replaymod.replaystudio.pathing.property.PropertyPart; import com.replaymod.replaystudio.pathing.property.PropertyParts; -import com.replaymod.gui.utils.NonNull; import java.io.IOException; import java.util.Collection; @@ -19,6 +19,7 @@ public class TimestampProperty extends AbstractProperty { public static final TimestampProperty PROPERTY = new TimestampProperty(); public final PropertyPart TIME = new PropertyParts.ForInteger(this, true); + private TimestampProperty() { super("timestamp", "replaymod.gui.editkeyframe.timestamp", null, 0); } diff --git a/src/main/java/com/replaymod/recording/ReplayModRecording.java b/src/main/java/com/replaymod/recording/ReplayModRecording.java index a6edf532..7bcb1267 100644 --- a/src/main/java/com/replaymod/recording/ReplayModRecording.java +++ b/src/main/java/com/replaymod/recording/ReplayModRecording.java @@ -5,36 +5,27 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Restrictions; import com.replaymod.core.versions.MCVer.Keyboard; +import com.replaymod.mixin.NetworkManagerAccessor; import com.replaymod.recording.handler.ConnectionEventHandler; import com.replaymod.recording.handler.GuiHandler; -import com.replaymod.mixin.NetworkManagerAccessor; import com.replaymod.recording.packet.PacketListener; import io.netty.channel.Channel; import io.netty.util.AttributeKey; import net.minecraft.network.NetworkManager; +import net.minecraftforge.fml.network.NetworkRegistry; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -//#if FABRIC>=1 -//$$ import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; -//#else -import net.minecraftforge.fml.network.NetworkRegistry; -//#endif - -//#if MC>=11400 -//#else -//$$ import io.netty.channel.ChannelDuplexHandler; -//$$ import io.netty.channel.ChannelHandler; -//#endif public class ReplayModRecording implements Module { private static final Logger LOGGER = LogManager.getLogger(); - //#if MC>=11400 private static final AttributeKey ATTR_CHECKED = AttributeKey.newInstance("ReplayModRecording_checked"); - //#endif - { instance = this; } + { + instance = this; + } + public static ReplayModRecording instance; private ReplayMod core; @@ -67,29 +58,15 @@ public void initClient() { new GuiHandler(core).register(); - //#if FABRIC>=1 - //$$ ClientSidePacketRegistry.INSTANCE.register(Restrictions.PLUGIN_CHANNEL, (packetContext, packetByteBuf) -> {}); - //#else - //#if MC>=11400 NetworkRegistry.newEventChannel(Restrictions.PLUGIN_CHANNEL, () -> "0", any -> true, any -> true); - //#else - //$$ NetworkRegistry.INSTANCE.newChannel(Restrictions.PLUGIN_CHANNEL, new RestrictionsChannelHandler()); - //#endif - //#endif } - //#if MC<11400 - //$$ @ChannelHandler.Sharable - //$$ private static class RestrictionsChannelHandler extends ChannelDuplexHandler {} - //#endif public void initiateRecording(NetworkManager networkManager) { Channel channel = ((NetworkManagerAccessor) networkManager).getChannel(); if (channel.pipeline().get("ReplayModReplay_replaySender") != null) return; - //#if MC>=11400 if (channel.hasAttr(ATTR_CHECKED)) return; channel.attr(ATTR_CHECKED).set(null); - //#endif connectionEventHandler.onConnectedToServerEvent(networkManager); } diff --git a/src/main/java/com/replaymod/recording/ServerInfoExt.java b/src/main/java/com/replaymod/recording/ServerInfoExt.java index 986bb04b..09e3c49a 100644 --- a/src/main/java/com/replaymod/recording/ServerInfoExt.java +++ b/src/main/java/com/replaymod/recording/ServerInfoExt.java @@ -2,16 +2,22 @@ import net.minecraft.client.multiplayer.ServerData; -/** Extension interface for {@link net.minecraft.client.multiplayer.ServerData}. */ +/** + * Extension interface for {@link net.minecraft.client.multiplayer.ServerData}. + */ public interface ServerInfoExt { static ServerInfoExt from(ServerData base) { return (ServerInfoExt) base; } - /** Per-server optional overwrite for {@link Setting#AUTO_START_RECORDING}. */ + /** + * Per-server optional overwrite for {@link Setting#AUTO_START_RECORDING}. + */ Boolean getAutoRecording(); - /** Per-server optional overwrite for {@link Setting#AUTO_START_RECORDING}. */ + /** + * Per-server optional overwrite for {@link Setting#AUTO_START_RECORDING}. + */ void setAutoRecording(Boolean autoRecording); } diff --git a/src/main/java/com/replaymod/recording/gui/GuiRecordingControls.java b/src/main/java/com/replaymod/recording/gui/GuiRecordingControls.java index 05731fe3..dbd945bf 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiRecordingControls.java +++ b/src/main/java/com/replaymod/recording/gui/GuiRecordingControls.java @@ -4,21 +4,18 @@ import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; import com.replaymod.editor.gui.MarkerProcessor; -import com.replaymod.gui.container.GuiScreen; -import com.replaymod.recording.packet.PacketListener; import com.replaymod.gui.container.GuiPanel; +import com.replaymod.gui.container.GuiScreen; import com.replaymod.gui.container.VanillaGuiScreen; import com.replaymod.gui.element.GuiButton; import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.InitScreenCallback; +import com.replaymod.recording.packet.PacketListener; import net.minecraft.client.gui.screen.IngameMenuScreen; import net.minecraft.client.gui.screen.Screen; - -//#if MC>=11400 import net.minecraft.client.gui.widget.Widget; -//#endif import java.util.List; import java.util.Optional; @@ -33,7 +30,8 @@ public class GuiRecordingControls extends EventRegistrations { private GuiPanel panel = new GuiPanel().setLayout(new HorizontalLayout().setSpacing(4)); private GuiButton buttonPauseResume = new GuiButton(panel).onClick(() -> { - if (Utils.ifMinimalModeDoPopup(panel, () -> {})) return; + if (Utils.ifMinimalModeDoPopup(panel, () -> { + })) return; if (paused) { packetListener.addMarker(MarkerProcessor.MARKER_NAME_END_CUT); } else { @@ -44,7 +42,8 @@ public class GuiRecordingControls extends EventRegistrations { }).setSize(98, 20); private GuiButton buttonStartStop = new GuiButton(panel).onClick(() -> { - if (Utils.ifMinimalModeDoPopup(panel, () -> {})) return; + if (Utils.ifMinimalModeDoPopup(panel, () -> { + })) return; if (stopped) { paused = false; packetListener.addMarker(MarkerProcessor.MARKER_NAME_END_CUT); @@ -76,13 +75,12 @@ private void updateState() { buttonPauseResume.setEnabled(!stopped); } - { on(InitScreenCallback.EVENT, this::injectIntoIngameMenu); } + { + on(InitScreenCallback.EVENT, this::injectIntoIngameMenu); + } + private void injectIntoIngameMenu(Screen guiScreen, - //#if MC>=11400 List buttonList - //#else - //$$ List buttonList - //#endif ) { if (!(guiScreen instanceof IngameMenuScreen)) { return; diff --git a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java index 5ccbeec3..44668550 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java +++ b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java @@ -1,19 +1,19 @@ package com.replaymod.recording.gui; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.core.SettingsRegistry; -import com.replaymod.recording.Setting; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.MinecraftGuiRenderer; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.RenderHudCallback; +import com.replaymod.recording.Setting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; -import com.mojang.blaze3d.matrix.MatrixStack; +import static com.mojang.blaze3d.platform.GlStateManager.enableAlphaTest; import static com.replaymod.core.ReplayMod.TEXTURE; import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; -import static com.mojang.blaze3d.platform.GlStateManager.*; /** * Renders overlay during recording. @@ -31,17 +31,17 @@ public GuiRecordingOverlay(Minecraft mc, SettingsRegistry settingsRegistry, GuiR /** * Render the recording icon and text in the top left corner of the screen. - */ - { on(RenderHudCallback.EVENT, (stack, partialTicks) -> renderRecordingIndicator(stack)); } + */ { + on(RenderHudCallback.EVENT, (stack, partialTicks) -> renderRecordingIndicator(stack)); + } + private void renderRecordingIndicator(MatrixStack stack) { if (guiControls.isStopped()) return; if (settingsRegistry.get(Setting.INDICATOR)) { FontRenderer fontRenderer = mc.fontRenderer; String text = guiControls.isPaused() ? I18n.format("replaymod.gui.paused") : I18n.format("replaymod.gui.recording"); fontRenderer.drawString( - //#if MC>=11600 stack, - //#endif text.toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff); mc.getTextureManager().bindTexture(TEXTURE); enableAlphaTest(); diff --git a/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java b/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java index 047818f5..f30fd9ad 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java +++ b/src/main/java/com/replaymod/recording/gui/GuiSavingReplay.java @@ -2,15 +2,7 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; -import com.replaymod.recording.Setting; -import com.replaymod.replay.gui.screen.GuiReplayViewer; -import com.replaymod.replaystudio.replay.ReplayMetaData; -import com.replaymod.replaystudio.us.myles.ViaVersion.api.Pair; -import com.replaymod.gui.container.AbstractGuiScreen; -import com.replaymod.gui.container.GuiContainer; -import com.replaymod.gui.container.GuiPanel; -import com.replaymod.gui.container.GuiScreen; -import com.replaymod.gui.container.VanillaGuiScreen; +import com.replaymod.gui.container.*; import com.replaymod.gui.element.GuiButton; import com.replaymod.gui.element.GuiLabel; import com.replaymod.gui.element.GuiTextField; @@ -21,6 +13,10 @@ import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.layout.VerticalLayout; import com.replaymod.gui.utils.Colors; +import com.replaymod.recording.Setting; +import com.replaymod.replay.gui.screen.GuiReplayViewer; +import com.replaymod.replaystudio.replay.ReplayMetaData; +import com.replaymod.replaystudio.us.myles.ViaVersion.api.Pair; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import net.minecraft.client.Minecraft; @@ -148,7 +144,8 @@ private void applyOutput(Path path, String newName) { } catch (IOException e) { logger.error("Deleting replay file:", e); CrashReport crashReport = CrashReport.makeCrashReport(e, "Deleting replay file"); - core.runLater(() -> Utils.error(logger, VanillaGuiScreen.wrap(mc.currentScreen), crashReport, () -> {})); + core.runLater(() -> Utils.error(logger, VanillaGuiScreen.wrap(mc.currentScreen), crashReport, () -> { + })); } return; } @@ -163,7 +160,8 @@ private void applyOutput(Path path, String newName) { } catch (IOException e) { logger.error("Renaming replay file:", e); CrashReport crashReport = CrashReport.makeCrashReport(e, "Renaming replay file"); - core.runLater(() -> Utils.error(logger, VanillaGuiScreen.wrap(mc.currentScreen), crashReport, () -> {})); + core.runLater(() -> Utils.error(logger, VanillaGuiScreen.wrap(mc.currentScreen), crashReport, () -> { + })); } } } diff --git a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java index 0473c52e..3e5c4b22 100644 --- a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java @@ -3,13 +3,12 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.ModCompat; import com.replaymod.core.utils.Utils; -import com.replaymod.core.versions.MCVer; import com.replaymod.editor.gui.MarkerProcessor; +import com.replaymod.mixin.NetworkManagerAccessor; import com.replaymod.recording.ServerInfoExt; import com.replaymod.recording.Setting; import com.replaymod.recording.gui.GuiRecordingControls; import com.replaymod.recording.gui.GuiRecordingOverlay; -import com.replaymod.mixin.NetworkManagerAccessor; import com.replaymod.recording.packet.PacketListener; import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayMetaData; @@ -18,19 +17,8 @@ import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.resources.I18n; import net.minecraft.network.NetworkManager; -import org.apache.logging.log4j.Logger; - -//#if MC>=11600 import net.minecraft.world.World; -//#else -//#if MC>=11400 -//$$ import net.minecraft.world.dimension.DimensionType; -//#endif -//$$ -//#if MC>=10800 -//$$ import net.minecraft.world.level.LevelGeneratorType; -//#endif -//#endif +import org.apache.logging.log4j.Logger; import java.nio.file.Path; import java.text.SimpleDateFormat; @@ -65,26 +53,16 @@ public void onConnectedToServerEvent(NetworkManager networkManager) { try { boolean local = networkManager.isLocalChannel(); if (local) { - //#if MC>=10800 - //#if MC>=11600 if (mc.getIntegratedServer().getWorld(World.OVERWORLD).isDebug()) { - //#else - //#if MC>=11400 - //$$ if (mc.getServer().getWorld(DimensionType.OVERWORLD).getGeneratorType() == LevelGeneratorType.DEBUG_ALL_BLOCK_STATES) { - //#else - //$$ if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType.DEBUG_ALL_BLOCK_STATES) { - //#endif - //#endif logger.info("Debug World recording is not supported."); return; } - //#endif - if(!core.getSettingsRegistry().get(Setting.RECORD_SINGLEPLAYER)) { + if (!core.getSettingsRegistry().get(Setting.RECORD_SINGLEPLAYER)) { logger.info("Singleplayer Recording is disabled"); return; } } else { - if(!core.getSettingsRegistry().get(Setting.RECORD_SERVER)) { + if (!core.getSettingsRegistry().get(Setting.RECORD_SERVER)) { logger.info("Multiplayer Recording is disabled"); return; } @@ -94,11 +72,7 @@ public void onConnectedToServerEvent(NetworkManager networkManager) { String serverName = null; boolean autoStart = core.getSettingsRegistry().get(Setting.AUTO_START_RECORDING); if (local) { - //#if MC>=11600 worldName = mc.getIntegratedServer().getServerConfiguration().getWorldName(); - //#else - //$$ worldName = mc.getServer().getLevelName(); - //#endif serverName = worldName; } else if (mc.getCurrentServerData() != null) { ServerData serverInfo = mc.getCurrentServerData(); @@ -111,11 +85,9 @@ public void onConnectedToServerEvent(NetworkManager networkManager) { if (autoStartServer != null) { autoStart = autoStartServer; } - //#if MC>=11100 } else if (mc.isConnectedToRealms()) { // we can't access the server name without tapping too deep in the Realms Library worldName = "A Realms Server"; - //#endif } else { logger.info("Recording not started as the world is neither local nor remote (probably a replay)."); return; diff --git a/src/main/java/com/replaymod/recording/handler/GuiHandler.java b/src/main/java/com/replaymod/recording/handler/GuiHandler.java index dcc2a802..85f7de77 100644 --- a/src/main/java/com/replaymod/recording/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/recording/handler/GuiHandler.java @@ -3,9 +3,6 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.SettingsRegistry; import com.replaymod.core.gui.GuiReplayButton; -import com.replaymod.recording.ServerInfoExt; -import com.replaymod.recording.Setting; -import com.replaymod.mixin.AddServerScreenAccessor; import com.replaymod.gui.container.GuiScreen; import com.replaymod.gui.container.VanillaGuiScreen; import com.replaymod.gui.element.GuiButton; @@ -15,6 +12,9 @@ import com.replaymod.gui.popup.GuiInfoPopup; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.InitScreenCallback; +import com.replaymod.mixin.AddServerScreenAccessor; +import com.replaymod.recording.ServerInfoExt; +import com.replaymod.recording.Setting; import net.minecraft.client.gui.screen.AddServerScreen; import net.minecraft.client.gui.screen.MultiplayerScreen; import net.minecraft.client.gui.screen.WorldSelectionScreen; @@ -29,7 +29,10 @@ public GuiHandler(ReplayMod mod) { this.mod = mod; } - { on(InitScreenCallback.EVENT, (screen, buttons) -> onGuiInit(screen)); } + { + on(InitScreenCallback.EVENT, (screen, buttons) -> onGuiInit(screen)); + } + private void onGuiInit(net.minecraft.client.gui.screen.Screen gui) { if (gui instanceof WorldSelectionScreen || gui instanceof MultiplayerScreen) { boolean sp = gui instanceof WorldSelectionScreen; diff --git a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java index d7cfdec3..ed690fed 100644 --- a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java @@ -1,66 +1,33 @@ package com.replaymod.recording.handler; +import com.mojang.datafixers.util.Pair; import com.replaymod.core.events.PreRenderCallback; -import com.replaymod.mixin.IntegratedServerAccessor; -import com.replaymod.recording.packet.PacketListener; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.PreTickCallback; +import com.replaymod.mixin.EntityLivingBaseAccessor; +import com.replaymod.mixin.IntegratedServerAccessor; +import com.replaymod.recording.packet.PacketListener; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.Entity; -import net.minecraft.network.play.server.SAnimateBlockBreakPacket; -import net.minecraft.network.play.server.SAnimateHandPacket; -import net.minecraft.network.play.server.SMountEntityPacket; -import net.minecraft.network.play.server.SEntityEquipmentPacket; -import net.minecraft.network.play.server.SEntityTeleportPacket; -import net.minecraft.network.play.server.SEntityPacket; -import net.minecraft.network.play.server.SEntityHeadLookPacket; -import net.minecraft.network.play.server.SEntityVelocityPacket; -import net.minecraft.network.play.server.SSpawnPlayerPacket; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.ItemStack; import net.minecraft.network.IPacket; -import net.minecraft.server.integrated.IntegratedServer; -// FIXME not (yet?) 1.13 import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; - -//#if FABRIC<1 -import net.minecraft.network.play.server.SCollectItemPacket; -import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.ItemPickupEvent; -//#endif - -//#if MC>=11600 -import com.mojang.datafixers.util.Pair; -import java.util.Collections; -//#endif - -//#if MC>=11400 -//#else -//$$ import net.minecraft.network.play.server.SPacketUseBed; -//#endif - -//#if MC>=10904 -import com.replaymod.mixin.EntityLivingBaseAccessor; -import net.minecraft.network.play.server.SEntityMetadataPacket; -import net.minecraft.network.play.server.SPlaySoundEffectPacket; -import net.minecraft.network.play.server.SPlaySoundEventPacket; -import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.network.play.server.*; +import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.util.Hand; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; -//#endif - -//#if MC>=10800 import net.minecraft.util.math.BlockPos; -//#else -//$$ import net.minecraft.util.MathHelper; -//#endif +import net.minecraftforge.event.entity.player.PlayerEvent.ItemPickupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import java.util.Collections; import java.util.Objects; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.getMinecraft; public class RecordingEventHandler extends EventRegistrations { @@ -73,10 +40,8 @@ public class RecordingEventHandler extends EventRegistrations { private boolean wasSleeping; private int lastRiding = -1; private Integer rotationYawHeadBefore; - //#if MC>=10904 private boolean wasHandActive; private Hand lastActiveHand; - //#endif public RecordingEventHandler(PacketListener packetListener) { this.packetListener = packetListener; @@ -97,33 +62,28 @@ public void unregister() { } } - //#if MC>=11400 public void onPacket(IPacket packet) { packetListener.save(packet); } - //#endif public void spawnRecordingPlayer() { try { ClientPlayerEntity player = mc.player; assert player != null; packetListener.save(new SSpawnPlayerPacket(player)); - //#if MC>=11500 packetListener.save(new SEntityMetadataPacket(player.getEntityId(), player.getDataManager(), true)); - //#endif lastX = lastY = lastZ = null; - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - //#if MC>=10904 public void onClientSound(SoundEvent sound, SoundCategory category, double x, double y, double z, float volume, float pitch) { try { // Send to all other players in ServerWorldEventHandler#playSoundToAllNearExcept packetListener.save(new SPlaySoundEffectPacket(sound, category, x, y, z, volume, pitch)); - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } @@ -132,20 +92,22 @@ public void onClientEffect(int type, BlockPos pos, int data) { try { // Send to all other players in ServerWorldEventHandler#playEvent packetListener.save(new SPlaySoundEventPacket(type, pos, data, false)); - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - //#endif - { on(PreTickCallback.EVENT, this::onPlayerTick); } + { + on(PreTickCallback.EVENT, this::onPlayerTick); + } + private void onPlayerTick() { if (mc.player == null) return; ClientPlayerEntity player = mc.player; try { boolean force = false; - if(lastX == null || lastY == null || lastZ == null) { + if (lastX == null || lastY == null || lastZ == null) { force = true; lastX = player.getPosX(); lastY = player.getPosY(); @@ -153,7 +115,7 @@ private void onPlayerTick() { } ticksSinceLastCorrection++; - if(ticksSinceLastCorrection >= 100) { + if (ticksSinceLastCorrection >= 100) { ticksSinceLastCorrection = 0; force = true; } @@ -168,66 +130,31 @@ private void onPlayerTick() { IPacket packet; if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) { - //#if MC>=10800 packet = new SEntityTeleportPacket(player); - //#else - //$$ // In 1.7.10 the client player entity has its posY at eye height - //$$ // but for all other entities it's at their feet (as it should be). - //$$ // So, to correctly position the player, we teleport them to their feet (i.a. directly after spawn). - //$$ // Note: this leaves the lastY value offset by the eye height but because it's only used for relative - //$$ // movement, that doesn't matter. - //$$ S18PacketEntityTeleport teleportPacket = new S18PacketEntityTeleport(player); - //$$ packet = new S18PacketEntityTeleport( - //$$ teleportPacket.func_149451_c(), - //$$ teleportPacket.func_149449_d(), - //$$ MathHelper.floor_double(player.boundingBox.minY * 32), - //$$ teleportPacket.func_149446_f(), - //$$ teleportPacket.func_149450_g(), - //$$ teleportPacket.func_149447_h() - //$$ ); - //#endif } else { byte newYaw = (byte) ((int) (player.rotationYaw * 256.0F / 360.0F)); byte newPitch = (byte) ((int) (player.rotationPitch * 256.0F / 360.0F)); - //#if MC>=11400 packet = new SEntityPacket.MovePacket( - //#else - //$$ packet = new SPacketEntity.S17PacketEntityLookMove( - //#endif player.getEntityId(), - //#if MC>=10904 (short) Math.round(dx * 4096), (short) Math.round(dy * 4096), (short) Math.round(dz * 4096), - //#else - //$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32), - //#endif newYaw, newPitch - //#if MC>=11600 , player.isOnGround() - //#else - //#if MC>=10800 - //$$ , player.onGround - //#endif - //#endif ); } packetListener.save(packet); //HEAD POS - int rotationYawHead = ((int)(player.rotationYawHead * 256.0F / 360.0F)); + int rotationYawHead = ((int) (player.rotationYawHead * 256.0F / 360.0F)); - if(!Objects.equals(rotationYawHead, rotationYawHeadBefore)) { + if (!Objects.equals(rotationYawHead, rotationYawHeadBefore)) { packetListener.save(new SEntityHeadLookPacket(player, (byte) rotationYawHead)); rotationYawHeadBefore = rotationYawHead; } packetListener.save(new SEntityVelocityPacket(player.getEntityId(), - //#if MC>=11400 player.getMotion() - //#else - //$$ player.motionX, player.motionY, player.motionZ - //#endif )); //Animation Packets @@ -235,11 +162,7 @@ private void onPlayerTick() { if (player.isSwingInProgress && player.swingProgressInt == 0) { packetListener.save(new SAnimateHandPacket( player, - //#if MC>=10904 player.swingingHand == Hand.MAIN_HAND ? 0 : 3 - //#else - //$$ 0 - //#endif )); } @@ -264,49 +187,13 @@ private void onPlayerTick() { */ //Inventory Handling - //#if MC>=10904 for (EquipmentSlotType slot : EquipmentSlotType.values()) { ItemStack stack = player.getItemStackFromSlot(slot); if (playerItems[slot.ordinal()] != stack) { playerItems[slot.ordinal()] = stack; - //#if MC>=11600 packetListener.save(new SEntityEquipmentPacket(player.getEntityId(), Collections.singletonList(Pair.of(slot, stack)))); - //#else - //$$ packetListener.save(new EntityEquipmentUpdateS2CPacket(player.getEntityId(), slot, stack)); - //#endif } } - //#else - //$$ if(playerItems[0] != mc.thePlayer.getHeldItem()) { - //$$ playerItems[0] = mc.thePlayer.getHeldItem(); - //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 0, playerItems[0]); - //$$ packetListener.save(pee); - //$$ } - //$$ - //$$ if(playerItems[1] != mc.thePlayer.inventory.armorInventory[0]) { - //$$ playerItems[1] = mc.thePlayer.inventory.armorInventory[0]; - //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 1, playerItems[1]); - //$$ packetListener.save(pee); - //$$ } - //$$ - //$$ if(playerItems[2] != mc.thePlayer.inventory.armorInventory[1]) { - //$$ playerItems[2] = mc.thePlayer.inventory.armorInventory[1]; - //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 2, playerItems[2]); - //$$ packetListener.save(pee); - //$$ } - //$$ - //$$ if(playerItems[3] != mc.thePlayer.inventory.armorInventory[2]) { - //$$ playerItems[3] = mc.thePlayer.inventory.armorInventory[2]; - //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 3, playerItems[3]); - //$$ packetListener.save(pee); - //$$ } - //$$ - //$$ if(playerItems[4] != mc.thePlayer.inventory.armorInventory[3]) { - //$$ playerItems[4] = mc.thePlayer.inventory.armorInventory[3]; - //$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 4, playerItems[4]); - //$$ packetListener.save(pee); - //$$ } - //#endif //Leaving Ride @@ -315,21 +202,17 @@ private void onPlayerTick() { if (lastRiding != vehicleId) { lastRiding = vehicleId; packetListener.save(new SMountEntityPacket( - //#if MC<10904 - //$$ 0, - //#endif player, vehicle )); } //Sleeping - if(!player.isSleeping() && wasSleeping) { + if (!player.isSleeping() && wasSleeping) { packetListener.save(new SAnimateHandPacket(player, 2)); wasSleeping = false; } - //#if MC>=10904 // Active hand (e.g. eating, drinking, blocking) if (player.isHandActive() ^ wasHandActive || player.getActiveHand() != lastActiveHand) { wasHandActive = player.isHandActive(); @@ -339,127 +222,61 @@ private void onPlayerTick() { dataManager.register(EntityLivingBaseAccessor.getLivingFlags(), (byte) state); packetListener.save(new SEntityMetadataPacket(player.getEntityId(), dataManager, true)); } - //#endif - } catch(Exception e1) { + } catch (Exception e1) { e1.printStackTrace(); } } - //#if FABRIC>=1 - //$$ // FIXME fabric - //#else @SubscribeEvent public void onPickupItem(ItemPickupEvent event) { try { - //#if MC>=11100 - //#if MC>=11200 - //#if MC>=11400 ItemStack stack = event.getStack(); packetListener.save(new SCollectItemPacket( event.getOriginalEntity().getEntityId(), event.getPlayer().getEntityId(), event.getStack().getCount() )); - //#else - //$$ packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId(), - //$$ event.pickedUp.getItem().getMaxStackSize())); - //#endif - //#else - //$$ packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId(), - //$$ event.pickedUp.getEntityItem().getMaxStackSize())); - //#endif - //#else - //$$ packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId())); - //#endif - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - //#endif - //#if MC>=11400 // FIXME fabric - //#else - //$$ @SubscribeEvent - //$$ public void onSleep(PlayerSleepInBedEvent event) { - //$$ try { - //#if MC>=10904 - //$$ if (event.getEntityPlayer() != mc.player) { - //$$ return; - //$$ } - //$$ - //$$ packetListener.save(new SPacketUseBed(event.getEntityPlayer(), event.getPos())); - //#else - //$$ if (event.entityPlayer != mc.thePlayer) { - //$$ return; - //$$ } - //$$ - //$$ packetListener.save(new S0APacketUseBed(event.entityPlayer, - //#if MC>=10800 - //$$ event.pos - //#else - //$$ event.x, event.y, event.z - //#endif - //$$ )); - //#endif - //$$ - //$$ wasSleeping = true; - //$$ - //$$ } catch(Exception e) { - //$$ e.printStackTrace(); - //$$ } - //$$ } - //#endif /* FIXME event not (yet?) on 1.13 @SubscribeEvent public void enterMinecart(MinecartInteractEvent event) { try { - //#if MC>=10904 - if(event.getEntity() != mc.player) { + if(event.getEntity() != mc.player) { return; } packetListener.save(new SPacketEntityAttach(event.getPlayer(), event.getMinecart())); lastRiding = event.getMinecart().getEntityId(); - //#else - //$$ if(event.entity != mc.thePlayer) { - //$$ return; - //$$ } - //$$ - //$$ packetListener.save(new S1BPacketEntityAttach(0, event.player, event.minecart)); - //$$ - //$$ lastRiding = event.minecart.getEntityId(); - //#endif - } catch(Exception e) { + } catch(Exception e) { e.printStackTrace(); } } */ - //#if MC>=10800 public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) { - //#else - //$$ public void onBlockBreakAnim(int breakerId, int x, int y, int z, int progress) { - //#endif PlayerEntity thePlayer = mc.player; if (thePlayer != null && breakerId == thePlayer.getEntityId()) { packetListener.save(new SAnimateBlockBreakPacket(breakerId, - //#if MC>=10800 pos, - //#else - //$$ x, y, z, - //#endif progress)); } } - { on(PreRenderCallback.EVENT, this::checkForGamePaused); } + { + on(PreRenderCallback.EVENT, this::checkForGamePaused); + } + private void checkForGamePaused() { if (mc.isSingleplayer()) { - IntegratedServer server = mc.getIntegratedServer(); + IntegratedServer server = mc.getIntegratedServer(); if (server != null && ((IntegratedServerAccessor) server).isGamePaused()) { packetListener.setServerWasPaused(); } @@ -468,6 +285,7 @@ private void checkForGamePaused() { public interface RecordingEventSender { void setRecordingEventHandler(RecordingEventHandler recordingEventHandler); + RecordingEventHandler getRecordingEventHandler(); } } diff --git a/src/main/java/com/replaymod/recording/packet/PacketListener.java b/src/main/java/com/replaymod/recording/packet/PacketListener.java index 0ec1ffb7..c7524bbe 100644 --- a/src/main/java/com/replaymod/recording/packet/PacketListener.java +++ b/src/main/java/com/replaymod/recording/packet/PacketListener.java @@ -8,6 +8,7 @@ import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; import com.replaymod.editor.gui.MarkerProcessor; +import com.replaymod.gui.container.VanillaGuiScreen; import com.replaymod.recording.ReplayModRecording; import com.replaymod.recording.Setting; import com.replaymod.recording.gui.GuiSavingReplay; @@ -18,67 +19,38 @@ import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayMetaData; import com.replaymod.replaystudio.us.myles.ViaVersion.api.Pair; -import com.replaymod.gui.container.VanillaGuiScreen; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import net.minecraft.client.Minecraft; -import net.minecraft.network.play.server.SCustomPayloadPlayPacket; -import net.minecraft.network.play.server.SDisconnectPacket; -import net.minecraft.network.play.server.SCollectItemPacket; -import net.minecraft.network.play.server.SSpawnPlayerPacket; +import net.minecraft.crash.CrashReport; import net.minecraft.entity.Entity; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.network.ProtocolType; import net.minecraft.network.IPacket; import net.minecraft.network.PacketBuffer; +import net.minecraft.network.PacketDirection; +import net.minecraft.network.ProtocolType; +import net.minecraft.network.datasync.EntityDataManager; +import net.minecraft.network.login.server.SCustomPayloadLoginPacket; +import net.minecraft.network.login.server.SEnableCompressionPacket; +import net.minecraft.network.login.server.SLoginSuccessPacket; +import net.minecraft.network.play.server.*; import net.minecraft.util.text.StringTextComponent; -import net.minecraft.crash.CrashReport; import org.apache.commons.io.FilenameUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -//#if MC>=11400 -import net.minecraft.network.login.server.SLoginSuccessPacket; -//#else -//$$ import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; -//#endif - -//#if FABRIC<1 -import net.minecraft.network.login.server.SCustomPayloadLoginPacket; -//#endif - -//#if MC>=10904 -//#else -//$$ import java.util.List; -//#endif - -//#if MC>=10800 -//#if MC<10904 -//$$ import net.minecraft.network.play.server.S46PacketSetCompressionLevel; -//#endif -import net.minecraft.network.login.server.SEnableCompressionPacket; -import net.minecraft.network.play.server.SSendResourcePackPacket; -import net.minecraft.network.PacketDirection; -//#endif - import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.getMinecraft; import static com.replaymod.replaystudio.util.Utils.writeInt; public class PacketListener extends ChannelInboundHandlerAdapter { @@ -162,28 +134,17 @@ public void save(IPacket packet) { return; } try { - if(packet instanceof SSpawnPlayerPacket) { - //#if MC>=10800 + if (packet instanceof SSpawnPlayerPacket) { UUID uuid = ((SSpawnPlayerPacket) packet).getUniqueId(); - //#else - //$$ UUID uuid = ((S0CPacketSpawnPlayer) packet).func_148948_e().getId(); - //#endif Set uuids = new HashSet<>(Arrays.asList(metaData.getPlayers())); uuids.add(uuid.toString()); metaData.setPlayers(uuids.toArray(new String[uuids.size()])); saveMetaData(); } - //#if MC>=10800 if (packet instanceof SEnableCompressionPacket) { return; // Replay data is never compressed on the packet level } - //#if MC<10904 - //$$ if (packet instanceof S46PacketSetCompressionLevel) { - //$$ return; // Replay data is never compressed on the packet level - //$$ } - //#endif - //#endif long now = System.currentTimeMillis(); if (serverWasPaused) { @@ -220,12 +181,10 @@ public void save(IPacket packet) { } }); - //#if MC>=11400 if (packet instanceof SLoginSuccessPacket) { moveToPlayState(); } - //#endif - } catch(Exception e) { + } catch (Exception e) { logger.error("Writing packet:", e); } } @@ -304,8 +263,8 @@ public void channelInactive(ChannelHandlerContext ctx) { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - if(ctx == null) { - if(context == null) { + if (ctx == null) { + if (context == null) { return; } else { ctx = context; @@ -317,57 +276,27 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception try { IPacket packet = (IPacket) msg; - //#if MC>=10904 - if(packet instanceof SCollectItemPacket) { - if(mc.player != null || + if (packet instanceof SCollectItemPacket) { + if (mc.player != null || ((SCollectItemPacket) packet).getCollectedItemEntityID() == mc.player.getEntityId()) { - //#else - //$$ if(packet instanceof S0DPacketCollectItem) { - //$$ if(mc.thePlayer != null || ((S0DPacketCollectItem) packet).getEntityID() == mc.thePlayer.getEntityId()) { - //#endif super.channelRead(ctx, msg); return; } } - //#if MC>=10800 if (packet instanceof SSendResourcePackPacket) { save(resourcePackRecorder.handleResourcePack((SSendResourcePackPacket) packet)); return; } - //#else - //$$ if (packet instanceof S3FPacketCustomPayload) { - //$$ S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet; - //$$ if ("MC|RPack".equals(p.func_149169_c())) { - //$$ save(resourcePackRecorder.handleResourcePack(p)); - //$$ return; - //$$ } - //$$ } - //#endif - - //#if MC<11400 - //$$ if (packet instanceof FMLProxyPacket) { - //$$ // This packet requires special handling - //#if MC>=10800 - //$$ ((FMLProxyPacket) packet).toS3FPackets().forEach(this::save); - //#else - //$$ save(((FMLProxyPacket) packet).toS3FPacket()); - //#endif - //$$ super.channelRead(ctx, msg); - //$$ return; - //$$ } - //#endif - - //#if FABRIC<1 + + if (packet instanceof SCustomPayloadLoginPacket) { PacketBuffer buffer = new PacketBuffer(Unpooled.buffer()); packet.writePacketData(buffer); packet = new SCustomPayloadLoginPacket(); packet.readPacketData(buffer); } - //#endif - //#if MC>=10800 if (packet instanceof SCustomPayloadPlayPacket) { // Forge may read from this ByteBuf and/or release it during handling // We want to save the full thing however, so we create a copy and save that one instead of the @@ -380,7 +309,6 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception new PacketBuffer(((SCustomPayloadPlayPacket) packet).getBufferData().slice().retain()) ); } - //#endif save(packet); @@ -391,7 +319,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception save(packet); } } - } catch(Exception e) { + } catch (Exception e) { logger.error("Handling packet for recording:", e); } @@ -400,59 +328,12 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception super.channelRead(ctx, msg); } - //#if MC>=10904 private void DataManager_set(EntityDataManager dataManager, EntityDataManager.DataEntry entry) { dataManager.register(entry.getKey(), entry.getValue()); } - //#endif @SuppressWarnings("unchecked") private PacketData getPacketData(int timestamp, IPacket packet) throws Exception { - //#if MC<11500 - //$$ if (packet instanceof MobSpawnS2CPacket) { - //$$ MobSpawnS2CPacket p = (MobSpawnS2CPacket) packet; - //$$ SPacketSpawnMobAccessor pa = (SPacketSpawnMobAccessor) p; - //$$ if (pa.getDataManager() == null) { - //$$ pa.setDataManager(new DataTracker(null)); - //$$ if (p.getTrackedValues() != null) { - //$$ Set seen = new HashSet<>(); - //#if MC>=10904 - //$$ for (DataTracker.Entry entry : Lists.reverse(p.getTrackedValues())) { - //$$ if (!seen.add(entry.getData().getId())) continue; - //$$ DataManager_set(pa.getDataManager(), entry); - //$$ } - //#else - //$$ for(DataWatcher.WatchableObject wo : Lists.reverse((List) p.func_149027_c())) { - //$$ if (!seen.add(wo.getDataValueId())) continue; - //$$ pa.getDataManager().addObject(wo.getDataValueId(), wo.getObject()); - //$$ } - //#endif - //$$ } - //$$ } - //$$ } - //$$ - //$$ if (packet instanceof PlayerSpawnS2CPacket) { - //$$ PlayerSpawnS2CPacket p = (PlayerSpawnS2CPacket) packet; - //$$ SPacketSpawnPlayerAccessor pa = (SPacketSpawnPlayerAccessor) p; - //$$ if (pa.getDataManager() == null) { - //$$ pa.setDataManager(new DataTracker(null)); - //$$ if (p.getTrackedValues() != null) { - //$$ Set seen = new HashSet<>(); - //#if MC>=10904 - //$$ for (DataTracker.Entry entry : Lists.reverse(p.getTrackedValues())) { - //$$ if (!seen.add(entry.getData().getId())) continue; - //$$ DataManager_set(pa.getDataManager(), entry); - //$$ } - //#else - //$$ for(DataWatcher.WatchableObject wo : Lists.reverse((List) p.func_148944_c())) { - //$$ if (!seen.add(wo.getDataValueId())) continue; - //$$ pa.getDataManager().addObject(wo.getDataValueId(), wo.getObject()); - //$$ } - //#endif - //$$ } - //$$ } - //$$ } - //#endif Integer packetId = getPacketId(packet); ByteBuf byteBuf = Unpooled.buffer(); @@ -470,11 +351,9 @@ private PacketData getPacketData(int timestamp, IPacket packet) throws Exception } finally { byteBuf.release(); - //#if MC>=10800 if (packet instanceof SCustomPayloadPlayPacket) { ((SCustomPayloadPlayPacket) packet).getBufferData().release(); } - //#endif } } @@ -518,11 +397,7 @@ public void setServerWasPaused() { } private Integer getPacketId(IPacket packet) throws IOException { - //#if MC>=10800 Integer packetId = connectionState.getPacketId(PacketDirection.CLIENTBOUND, packet); - //#else - //$$ Integer packetId = (Integer) connectionState.func_150755_b().inverse().get(packet.getClass()); - //#endif if (packetId == null) { /* diff --git a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java index d8e2fccd..406044ba 100644 --- a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java +++ b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java @@ -2,57 +2,28 @@ import com.google.common.hash.Hashing; import com.google.common.io.Files; +import com.replaymod.gui.utils.Consumer; import com.replaymod.replaystudio.replay.ReplayFile; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.ConfirmScreen; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; +import net.minecraft.client.network.play.ClientPlayNetHandler; import net.minecraft.client.resources.DownloadingPackFinder; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -//#if MC>=11400 -import net.minecraft.util.text.TranslationTextComponent; -//#else -//$$ import net.minecraft.client.gui.GuiYesNoCallback; -//$$ import net.minecraft.client.resources.I18n; -//#endif - -//#if MC>=10800 -import com.replaymod.gui.utils.Consumer; -//#else -//$$ import net.minecraft.client.gui.GuiScreenWorking; -//$$ import net.minecraft.util.HttpUtil; -//#endif - -//#if MC>=10800 +import net.minecraft.network.NetworkManager; import net.minecraft.network.play.client.CResourcePackStatusPacket; import net.minecraft.network.play.client.CResourcePackStatusPacket.Action; import net.minecraft.network.play.server.SSendResourcePackPacket; -//#endif - -//#if MC>=10800 -//#if MC>=11400 -import java.util.concurrent.CompletableFuture; -//#else -//$$ import com.google.common.util.concurrent.ListenableFuture; -//#endif -import net.minecraft.client.network.play.ClientPlayNetHandler; -import net.minecraft.network.NetworkManager; -//#else -//$$ import com.replaymod.core.mixin.ResourcePackRepositoryAccessor; -//$$ import net.minecraft.client.multiplayer.ServerData.ServerResourceMode; -//$$ import net.minecraft.client.multiplayer.ServerList; -//$$ import net.minecraft.client.resources.FileResourcePack; -//$$ import net.minecraft.network.play.server.S3FPacketCustomPayload; -//$$ import org.apache.commons.io.Charsets; -//#endif +import net.minecraft.util.text.TranslationTextComponent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.CompletableFuture; import static com.replaymod.core.versions.MCVer.*; @@ -101,13 +72,8 @@ public void recordResourcePack(File file, int requestId) { } } - //#if MC>=10800 public CResourcePackStatusPacket makeStatusPacket(String hash, Action action) { - //#if MC>=11002 return new CResourcePackStatusPacket(action); - //#else - //$$ return new CPacketResourcePackStatus(hash, action); - //#endif } @@ -143,32 +109,21 @@ public synchronized SSendResourcePackPacket handleResourcePack(SSendResourcePack netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED)); } else { // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError) - //#if MC>=11400 mc.execute(() -> mc.displayGuiScreen(new ConfirmScreen(result -> { - //#else - //$$ //noinspection Convert2Lambda - //$$ mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() { - //$$ @Override - //$$ public void confirmClicked(boolean result, int id) { - //#endif - if (serverData != null) { - serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED); - } - if (result) { - netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED)); - downloadResourcePackFuture(requestId, url, hash); - } else { - netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED)); - } - - ServerList.saveSingleServer(serverData); - mc.displayGuiScreen(null); + if (serverData != null) { + serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED); + } + if (result) { + netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED)); + downloadResourcePackFuture(requestId, url, hash); + } else { + netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED)); } - //#if MC>=11400 - , new TranslationTextComponent("multiplayer.texturePrompt.line1"), new TranslationTextComponent("multiplayer.texturePrompt.line2")))); - //#else - //$$ }, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0))); - //#endif + + ServerList.saveSingleServer(serverData); + mc.displayGuiScreen(null); + } + , new TranslationTextComponent("multiplayer.texturePrompt.line1"), new TranslationTextComponent("multiplayer.texturePrompt.line2")))); } } @@ -181,12 +136,7 @@ private void downloadResourcePackFuture(int requestId, String url, final String throwable -> mc.getConnection().sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD))); } - private - //#if MC>=11400 - CompletableFuture - //#else - //$$ ListenableFuture - //#endif + private CompletableFuture downloadResourcePack(final int requestId, String url, String hash) { DownloadingPackFinder packFinder = mc.getPackFinder(); ((IDownloadingPackFinder) packFinder).setRequestCallback(file -> recordResourcePack(file, requestId)); @@ -196,79 +146,5 @@ private void downloadResourcePackFuture(int requestId, String url, final String public interface IDownloadingPackFinder { void setRequestCallback(Consumer callback); } - //#else - //$$ public synchronized S3FPacketCustomPayload handleResourcePack(S3FPacketCustomPayload packet) { - //$$ final int requestId = nextRequestId++; - //$$ final String url = new String(packet.func_149168_d(), Charsets.UTF_8); - //$$ - //$$ ServerData serverData = mc.getCurrentServerData(); - //$$ ServerResourceMode resourceMode = serverData == null ? ServerResourceMode.PROMPT : serverData.getResourceMode(); - //$$ if (resourceMode == ServerResourceMode.ENABLED) { - //$$ downloadResourcePack(requestId, url); - //$$ mc.getResourcePackRepository().obtainResourcePack(url); - //$$ } else if (resourceMode == ServerResourceMode.PROMPT) { - //$$ // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError) - //$$ //noinspection Convert2Lambda - //$$ mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() { - //$$ @Override - //$$ public void confirmClicked(boolean result, int id) { - //$$ if (serverData != null) { - //$$ serverData.setResourceMode(ServerResourceMode.ENABLED); - //$$ ServerList.func_147414_b(serverData); - //$$ } - //$$ - //$$ mc.displayGuiScreen(null); - //$$ - //$$ if (result) { - //$$ downloadResourcePack(requestId, url); - //$$ } - //$$ } - //$$ }, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0)); - //$$ } - //$$ - //$$ return new S3FPacketCustomPayload(packet.func_149169_c(), ("replay://" + requestId).getBytes(Charsets.UTF_8)); - //$$ } - //$$ - //$$ private void downloadResourcePack(final int requestId, String url) { - //$$ final ResourcePackRepository repo = mc.getResourcePackRepository(); - //$$ final ResourcePackRepositoryAccessor acc = (ResourcePackRepositoryAccessor) repo; - //$$ - //$$ String fileName = url.substring(url.lastIndexOf("/") + 1); - //$$ - //$$ if (fileName.contains("?")) { - //$$ fileName = fileName.substring(0, fileName.indexOf("?")); - //$$ } - //$$ - //$$ if (!fileName.endsWith(".zip")) { - //$$ return; - //$$ } - //$$ - //$$ fileName = fileName.replaceAll("\\W", ""); - //$$ - //$$ File file = new File(acc.getCacheDir(), fileName); - //$$ - //$$ HashMap hashmap = new HashMap<>(); - //$$ hashmap.put("X-Minecraft-Username", mc.getSession().getUsername()); - //$$ hashmap.put("X-Minecraft-UUID", mc.getSession().getPlayerID()); - //$$ hashmap.put("X-Minecraft-Version", "1.7.10"); - //$$ - //$$ GuiScreenWorking guiScreen = new GuiScreenWorking(); - //$$ Minecraft.getMinecraft().displayGuiScreen(guiScreen); - //$$ repo.func_148529_f(); - //$$ acc.setActive(true); - //$$ // Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError) - //$$ //noinspection Convert2Lambda - //$$ HttpUtil.downloadResourcePack(file, url, new HttpUtil.DownloadListener() { - //$$ public void onDownloadComplete(File file) { - //$$ if (acc.isActive()) { - //$$ acc.setActive(false); - //$$ acc.setPack(new FileResourcePack(file)); - //$$ Minecraft.getMinecraft().scheduleResourcesRefresh(); - //$$ recordResourcePack(file, requestId); - //$$ } - //$$ } - //$$ }, hashmap, 50*1024*1024, guiScreen, Minecraft.getMinecraft().getProxy()); - //$$ } - //#endif } diff --git a/src/main/java/com/replaymod/render/CameraPathExporter.java b/src/main/java/com/replaymod/render/CameraPathExporter.java index 1108670f..6348b88e 100644 --- a/src/main/java/com/replaymod/render/CameraPathExporter.java +++ b/src/main/java/com/replaymod/render/CameraPathExporter.java @@ -3,32 +3,17 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.versions.MCVer; import com.replaymod.replay.camera.CameraEntity; -import de.javagl.jgltf.impl.v2.Accessor; -import de.javagl.jgltf.impl.v2.Animation; -import de.javagl.jgltf.impl.v2.AnimationChannel; -import de.javagl.jgltf.impl.v2.AnimationChannelTarget; -import de.javagl.jgltf.impl.v2.AnimationSampler; -import de.javagl.jgltf.impl.v2.Asset; -import de.javagl.jgltf.impl.v2.Buffer; -import de.javagl.jgltf.impl.v2.BufferView; -import de.javagl.jgltf.impl.v2.Camera; -import de.javagl.jgltf.impl.v2.CameraPerspective; -import de.javagl.jgltf.impl.v2.GlTF; -import de.javagl.jgltf.impl.v2.Node; +import de.javagl.jgltf.impl.v2.*; import de.javagl.jgltf.model.io.v2.GltfAssetV2; import de.javagl.jgltf.model.io.v2.GltfAssetWriterV2; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Quaternion; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector4f; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; +import net.minecraft.util.math.vector.Vector3d; import org.apache.commons.io.FilenameUtils; import org.lwjgl.opengl.GL11; -//#if MC>=11400 -import net.minecraft.util.math.vector.Vector3d; -//#else -//#endif - import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; @@ -57,13 +42,8 @@ public void setup(int totalFrames) { } public void recordFrame(float tickDelta) { - //#if MC>=10800 Entity entity = mc.getRenderViewEntity() == null ? mc.player : mc.getRenderViewEntity(); - //#else - //$$ Entity entity = mc.renderViewEntity == null ? mc.thePlayer : mc.renderViewEntity; - //#endif - //#if MC>=11400 net.minecraft.client.renderer.ActiveRenderInfo camera = mc.gameRenderer.getActiveRenderInfo(); Vector3d vec = camera.getProjectedView(); float x = (float) vec.getX(); @@ -71,18 +51,6 @@ public void recordFrame(float tickDelta) { float z = (float) vec.getZ(); float yaw = camera.getYaw() + 180; float pitch = camera.getPitch(); - //#else - //#if MC>=10800 - //$$ float eyeHeight = entity.getEyeHeight(); - //#else - //$$ float eyeHeight = 1.62f - entity.yOffset; - //#endif - //$$ float x = (float) (entity.prevPosX + (entity.posX - entity.prevPosX) * tickDelta); - //$$ float y = (float) (entity.prevPosY + (entity.posY - entity.prevPosY) * tickDelta + eyeHeight); - //$$ float z = (float) (entity.prevPosZ + (entity.posZ - entity.prevPosZ) * tickDelta); - //$$ float yaw = entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * tickDelta + 180; - //$$ float pitch = entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * tickDelta; - //#endif float roll = entity instanceof CameraEntity ? ((CameraEntity) entity).roll : 0; Quaternion quatYaw = new Quaternion(); @@ -99,8 +67,8 @@ public void recordFrame(float tickDelta) { Quaternion.mul(quaternion, quatRoll, quaternion); quaternion.normalise(quaternion); - float[] translation = new float[] { x, y, z }; - float[] rotation = new float[] { quaternion.getX(), quaternion.getY(), quaternion.getZ(), quaternion.getW() }; + float[] translation = new float[]{x, y, z}; + float[] rotation = new float[]{quaternion.getX(), quaternion.getY(), quaternion.getZ(), quaternion.getW()}; timeBuffer.putFloat(framesDone / (float) settings.getFramesPerSecond()); for (float f : translation) { diff --git a/src/main/java/com/replaymod/render/EXRWriter.java b/src/main/java/com/replaymod/render/EXRWriter.java index 732a826e..576d9dd9 100644 --- a/src/main/java/com/replaymod/render/EXRWriter.java +++ b/src/main/java/com/replaymod/render/EXRWriter.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.render; import com.replaymod.core.versions.MCVer; @@ -48,11 +47,13 @@ public void consume(Map channels) { int numChannels = 4 + (depthFrame != null ? 1 : 0); stackPush(); - EXRHeader header = EXRHeader.mallocStack(); InitEXRHeader(header); + EXRHeader header = EXRHeader.mallocStack(); + InitEXRHeader(header); EXRChannelInfo.Buffer channelInfos = EXRChannelInfo.mallocStack(numChannels); IntBuffer pixelTypes = stackMallocInt(numChannels); IntBuffer requestedPixelTypes = stackMallocInt(numChannels); - EXRImage image = EXRImage.mallocStack(); InitEXRImage(image); + EXRImage image = EXRImage.mallocStack(); + InitEXRImage(image); PointerBuffer imagePointers = stackMallocPointer(numChannels); FloatBuffer images = memAllocFloat(width * height * numChannels); PointerBuffer err = stackMallocPointer(1); @@ -122,4 +123,3 @@ public void consume(Map channels) { public void close() { } } -//#endif diff --git a/src/main/java/com/replaymod/render/FFmpegWriter.java b/src/main/java/com/replaymod/render/FFmpegWriter.java index 37c3df98..dbf298c0 100644 --- a/src/main/java/com/replaymod/render/FFmpegWriter.java +++ b/src/main/java/com/replaymod/render/FFmpegWriter.java @@ -15,11 +15,7 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.TeeOutputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; import java.util.Map; @@ -49,12 +45,12 @@ public FFmpegWriter(final VideoRenderer renderer) throws IOException { String fileName = settings.getOutputFile().getName(); commandArgs = settings.getExportArguments() - .replace("%WIDTH%", String.valueOf(settings.getVideoWidth())) - .replace("%HEIGHT%", String.valueOf(settings.getVideoHeight())) - .replace("%FPS%", String.valueOf(settings.getFramesPerSecond())) - .replace("%FILENAME%", fileName) - .replace("%BITRATE%", String.valueOf(settings.getBitRate())) - .replace("%FILTERS%", settings.getVideoFilters()); + .replace("%WIDTH%", String.valueOf(settings.getVideoWidth())) + .replace("%HEIGHT%", String.valueOf(settings.getVideoHeight())) + .replace("%FPS%", String.valueOf(settings.getFramesPerSecond())) + .replace("%FILENAME%", fileName) + .replace("%BITRATE%", String.valueOf(settings.getBitRate())) + .replace("%FILTERS%", settings.getVideoFilters()); String executable = settings.getExportCommandOrDefault(); LOGGER.info("Starting {} with args: {}", executable, commandArgs); @@ -88,7 +84,7 @@ public void close() throws IOException { try { process.exitValue(); break; - } catch(IllegalThreadStateException ex) { + } catch (IllegalThreadStateException ex) { if (rem > 0) { try { Thread.sleep(Math.min(TimeUnit.NANOSECONDS.toMillis(rem) + 1, 100)); diff --git a/src/main/java/com/replaymod/render/PNGWriter.java b/src/main/java/com/replaymod/render/PNGWriter.java index 6476ba31..50607bbf 100644 --- a/src/main/java/com/replaymod/render/PNGWriter.java +++ b/src/main/java/com/replaymod/render/PNGWriter.java @@ -1,13 +1,13 @@ package com.replaymod.render; import com.replaymod.core.versions.MCVer; +import com.replaymod.gui.versions.Image; import com.replaymod.render.blend.Util.IOConsumer; import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.rendering.Channel; import com.replaymod.render.rendering.FrameConsumer; import com.replaymod.render.utils.ByteBufferPool; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import com.replaymod.gui.versions.Image; import net.minecraft.crash.CrashReport; import java.io.IOException; diff --git a/src/main/java/com/replaymod/render/RenderSettings.java b/src/main/java/com/replaymod/render/RenderSettings.java index 870eee6d..b8ea867b 100644 --- a/src/main/java/com/replaymod/render/RenderSettings.java +++ b/src/main/java/com/replaymod/render/RenderSettings.java @@ -43,11 +43,9 @@ public boolean hasFixedAspectRatio() { @SuppressWarnings("RedundantIfStatement") public boolean isSupported() { - //#if MC<10800 || MC>=11500 if (this == BLEND) { return false; } - //#endif return true; } @@ -94,7 +92,9 @@ public boolean hasBitrateSetting() { return preset != null && preset.contains("%BITRATE%"); } - public boolean isYuv420() { return preset != null && preset.contains("-pix_fmt yuv420p"); } + public boolean isYuv420() { + return preset != null && preset.contains("-pix_fmt yuv420p"); + } @Override public String toString() { @@ -106,11 +106,7 @@ public boolean isSupported() { return RenderMethod.BLEND.isSupported(); } else if (this == EXR) { // Need LJWGL 3 - //#if MC>=11400 return true; - //#else - //$$ return false; - //#endif } else { return true; } diff --git a/src/main/java/com/replaymod/render/ReplayModRender.java b/src/main/java/com/replaymod/render/ReplayModRender.java index 63abd70e..baba1276 100644 --- a/src/main/java/com/replaymod/render/ReplayModRender.java +++ b/src/main/java/com/replaymod/render/ReplayModRender.java @@ -3,13 +3,13 @@ import com.replaymod.core.Module; import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; +import com.replaymod.gui.container.VanillaGuiScreen; +import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.render.utils.RenderJob; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.events.ReplayClosedCallback; import com.replaymod.replay.events.ReplayOpenedCallback; import com.replaymod.replaystudio.replay.ReplayFile; -import com.replaymod.gui.container.VanillaGuiScreen; -import com.replaymod.gui.utils.EventRegistrations; import net.minecraft.crash.CrashReport; import net.minecraft.crash.ReportedException; import org.apache.commons.io.FileUtils; @@ -23,7 +23,10 @@ import java.util.List; public class ReplayModRender extends EventRegistrations implements Module { - { instance = this; } + { + instance = this; + } + public static ReplayModRender instance; private ReplayMod core; @@ -67,7 +70,10 @@ public List getRenderQueue() { return renderQueue; } - { on(ReplayOpenedCallback.EVENT, this::onReplayOpened); } + { + on(ReplayOpenedCallback.EVENT, this::onReplayOpened); + } + private void onReplayOpened(ReplayHandler replayHandler) { replayFile = replayHandler.getReplayFile(); try { @@ -77,7 +83,10 @@ private void onReplayOpened(ReplayHandler replayHandler) { } } - { on(ReplayClosedCallback.EVENT, replayHandler -> onReplayClosed()); } + { + on(ReplayClosedCallback.EVENT, replayHandler -> onReplayClosed()); + } + private void onReplayClosed() { renderQueue.clear(); replayFile = null; @@ -90,7 +99,8 @@ public void saveRenderQueue() { e.printStackTrace(); VanillaGuiScreen screen = VanillaGuiScreen.wrap(getCore().getMinecraft().currentScreen); CrashReport report = CrashReport.makeCrashReport(e, "Reading timeline"); - Utils.error(LOGGER, screen, report, () -> {}); + Utils.error(LOGGER, screen, report, () -> { + }); } } } diff --git a/src/main/java/com/replaymod/render/blend/BlendMaterials.java b/src/main/java/com/replaymod/render/blend/BlendMaterials.java index b7c295fb..b615b151 100644 --- a/src/main/java/com/replaymod/render/blend/BlendMaterials.java +++ b/src/main/java/com/replaymod/render/blend/BlendMaterials.java @@ -1,10 +1,10 @@ package com.replaymod.render.blend; +import com.replaymod.gui.versions.Image; import com.replaymod.render.blend.data.DImage; import com.replaymod.render.blend.data.DMaterial; import com.replaymod.render.blend.data.DPackedFile; import com.replaymod.render.blend.data.DTexture; -import com.replaymod.gui.versions.Image; import net.minecraft.client.renderer.GLAllocation; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java b/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java index 752ea25b..c59a2bfd 100644 --- a/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java +++ b/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java @@ -1,48 +1,26 @@ -//#if MC>=10800 package com.replaymod.render.blend; +import com.mojang.datafixers.util.Pair; import com.replaymod.render.blend.data.DMaterial; import com.replaymod.render.blend.data.DMesh; import de.johni0702.minecraft.gui.utils.lwjgl.vector.ReadableVector3f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector2f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; +import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormatElement; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import org.lwjgl.opengl.GL11; -//#if MC>=11500 -import com.mojang.datafixers.util.Pair; -//#endif - -//#if MC>=10904 -//#if MC>=11200 -import net.minecraft.client.renderer.BufferBuilder; -//#else -//$$ import net.minecraft.client.renderer.VertexBuffer; -//#endif -//#else -//$$ import net.minecraft.client.renderer.WorldRenderer; -//#endif - import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.getElements; public class BlendMeshBuilder - //#if MC>=10904 - //#if MC>=11200 - extends BufferBuilder - //#else - //$$ extends VertexBuffer - //#endif - //#else - //$$ extends WorldRenderer - //#endif -{ + extends BufferBuilder { private static final ReadableVector3f VEC3F_ZERO = new Vector3f(0, 0, 0); private final DMesh mesh; private Vector3f offset; @@ -63,11 +41,7 @@ public void setReverseOffset(Vector3f offset) { } @Override - //#if MC>=10809 public void begin(int mode, VertexFormat vertexFormat) { - //#else - //$$ public void startDrawing(int mode) { - //#endif if (isDrawing) { if (!wellBehaved) { // Someone probably finished drawing with the global instance instead of this one, @@ -86,11 +60,7 @@ public void begin(int mode, VertexFormat vertexFormat) { Tessellator.getInstance().getBuffer().begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR); } - //#if MC>=10809 super.begin(mode, vertexFormat); - //#else - //$$ super.startDrawing(mode); - //#endif } public void maybeFinishDrawing() { @@ -102,11 +72,7 @@ public void maybeFinishDrawing() { } @Override - //#if MC>=10809 public void finishDrawing() { - //#else - //$$ public int finishDrawing() { - //#endif if (!isDrawing) { throw new IllegalStateException("Not building!"); } else { @@ -114,16 +80,10 @@ public void finishDrawing() { Tessellator.getInstance().getBuffer().finishDrawing(); } - //#if MC<10809 - //$$ int ret = - //#endif super.finishDrawing(); addBufferToMesh(); - //#if MC<10809 - //$$ return ret; - //#endif } } @@ -131,29 +91,13 @@ private void addBufferToMesh() { addBufferToMesh(this, mesh, offset); } - //#if MC>=10904 - //#if MC>=11200 public static DMesh addBufferToMesh(BufferBuilder bufferBuilder, DMesh mesh, ReadableVector3f vertOffset) { - //#else - //$$ public static DMesh addBufferToMesh(VertexBuffer bufferBuilder, DMesh mesh, Vector3f vertOffset) { - //#endif - //#else - //$$ public static DMesh addBufferToMesh(WorldRenderer bufferBuilder, DMesh mesh, Vector3f vertOffset) { - //#endif - //#if MC>=11500 Pair data = bufferBuilder.getNextBuffer(); return addBufferToMesh(data.getSecond(), data.getFirst().getDrawMode(), data.getFirst().getFormat(), mesh, vertOffset); - //#else - //$$ return addBufferToMesh(bufferBuilder.getByteBuffer(), bufferBuilder.getDrawMode(), bufferBuilder.getVertexFormat(), mesh, vertOffset); - //#endif } public static DMesh addBufferToMesh(ByteBuffer buffer, int mode, VertexFormat vertexFormat, DMesh mesh, ReadableVector3f vertOffset) { - //#if MC>=11400 int vertexCount = buffer.remaining() / vertexFormat.getSize(); - //#else - //$$ int vertexCount = buffer.remaining() / vertexFormat.getNextOffset(); - //#endif return addBufferToMesh(buffer, vertexCount, mode, vertexFormat, mesh, vertOffset); } @@ -168,48 +112,26 @@ public static DMesh addBufferToMesh(ByteBuffer buffer, int vertexCount, int mode // Determine offset of vertex components int posOffset = -1, colorOffset = -1, uvOffset = -1; int index = 0; - //#if MC>=11500 int elementOffset = 0; - //#endif for (VertexFormatElement element : getElements(vertexFormat)) { - //#if MC>=11500 int offset = elementOffset; elementOffset += element.getSize(); - //#else - //#if MC>=10809 - //$$ int offset = vertexFormat.getElementOffset(index); - //#else - //$$ int offset = element.getOffset(); - //#endif - //#endif switch (element.getUsage()) { case POSITION: - //#if MC>=11400 if (element.getType() != VertexFormatElement.Type.FLOAT) { - //#else - //$$ if (element.getType() != VertexFormatElement.EnumType.FLOAT) { - //#endif throw new UnsupportedOperationException("Only float is supported for position elements!"); } posOffset = offset; break; case COLOR: - //#if MC>=11400 if (element.getType() != VertexFormatElement.Type.UBYTE) { - //#else - //$$ if (element.getType() != VertexFormatElement.EnumType.UBYTE) { - //#endif throw new UnsupportedOperationException("Only unsigned byte is supported for color elements!"); } colorOffset = offset; break; case UV: if (element.getIndex() != 0) break; - //#if MC>=11400 if (element.getType() != VertexFormatElement.Type.FLOAT) { - //#else - //$$ if (element.getType() != VertexFormatElement.EnumType.UBYTE) { - //#endif throw new UnsupportedOperationException("Only float is supported for UV elements!"); } uvOffset = offset; @@ -223,16 +145,12 @@ public static DMesh addBufferToMesh(ByteBuffer buffer, int vertexCount, int mode List vertices = new ArrayList<>(vertexCount); List uvs = new ArrayList<>(vertexCount); List colors = new ArrayList<>(vertexCount); - //#if MC>=11400 int step = vertexFormat.getSize(); - //#else - //$$ int step = vertexFormat.getNextOffset(); - //#endif for (int offset = 0; offset < vertexCount * step; offset += step) { vertices.add(new DMesh.Vertex( - buffer.getFloat(offset ) - vertOffset.getX(), + buffer.getFloat(offset) - vertOffset.getX(), -buffer.getFloat(offset + 8) + vertOffset.getZ(), - buffer.getFloat(offset + 4) - vertOffset.getY() + buffer.getFloat(offset + 4) - vertOffset.getY() )); if (colorOffset != -1) { @@ -262,15 +180,15 @@ public static DMesh addBufferToMesh(ByteBuffer buffer, int vertexCount, int mode // Bundle vertices into shapes and add them to the mesh switch (mode) { case GL11.GL_TRIANGLES: - for (int i = 0; i < vertices.size(); i+=3) { + for (int i = 0; i < vertices.size(); i += 3) { mesh.addTriangle( - vertices.get(i ), + vertices.get(i), vertices.get(i + 1), vertices.get(i + 2), - uvs.get(i ), + uvs.get(i), uvs.get(i + 1), uvs.get(i + 2), - colors.get(i ), + colors.get(i), colors.get(i + 1), colors.get(i + 2), materialSlot @@ -278,17 +196,17 @@ public static DMesh addBufferToMesh(ByteBuffer buffer, int vertexCount, int mode } break; case GL11.GL_QUADS: - for (int i = 0; i < vertices.size(); i+=4) { + for (int i = 0; i < vertices.size(); i += 4) { mesh.addQuad( - vertices.get(i ), + vertices.get(i), vertices.get(i + 1), vertices.get(i + 2), vertices.get(i + 3), - uvs.get(i ), + uvs.get(i), uvs.get(i + 1), uvs.get(i + 2), uvs.get(i + 3), - colors.get(i ), + colors.get(i), colors.get(i + 1), colors.get(i + 2), colors.get(i + 3), @@ -303,4 +221,3 @@ public static DMesh addBufferToMesh(ByteBuffer buffer, int vertexCount, int mode return mesh; } } -//#endif diff --git a/src/main/java/com/replaymod/render/blend/BlendState.java b/src/main/java/com/replaymod/render/blend/BlendState.java index 8f1a6512..ad873b41 100644 --- a/src/main/java/com/replaymod/render/blend/BlendState.java +++ b/src/main/java/com/replaymod/render/blend/BlendState.java @@ -2,17 +2,7 @@ import com.replaymod.render.blend.data.DScene; import com.replaymod.render.blend.data.Serializer; -//#if MC>=10800 -// FIXME 1.15 -//#if MC<11500 -//$$ import com.replaymod.render.blend.exporters.ChunkExporter; -//#endif -import com.replaymod.render.blend.exporters.EntityExporter; -import com.replaymod.render.blend.exporters.ItemExporter; -import com.replaymod.render.blend.exporters.ParticlesExporter; -import com.replaymod.render.blend.exporters.RenderState; -import com.replaymod.render.blend.exporters.TileEntityExporter; -//#endif +import com.replaymod.render.blend.exporters.*; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.ReportedException; @@ -27,7 +17,6 @@ import java.util.List; import java.util.NoSuchElementException; -import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.render.ReplayModRender.LOGGER; // Note: @@ -53,18 +42,13 @@ public BlendState(File file) throws IOException { this.blenderFile = BlenderFactory.newBlenderFile(file); this.factory = new BlenderFactory(blenderFile); - //#if MC>=10800 RenderState renderState = new RenderState(this); register(renderState); // FIXME 1.15 - //#if MC<11500 - //$$ register(new ChunkExporter()); - //#endif register(new EntityExporter(renderState)); register(new TileEntityExporter(renderState)); register(new ParticlesExporter(renderState)); register(new ItemExporter(renderState)); - //#endif } public void register(Exporter exporter) { @@ -135,7 +119,7 @@ public void tearDown() { public void preFrame(int frame) { for (Exporter exporter : exporters) { try { - exporter.preFrame(frame); + exporter.preFrame(frame); } catch (IOException e) { CrashReport report = CrashReport.makeCrashReport(e, "Pre frame of blend exporter"); CrashReportCategory category = report.makeCategory("Exporter"); diff --git a/src/main/java/com/replaymod/render/blend/Exporter.java b/src/main/java/com/replaymod/render/blend/Exporter.java index ce5f96c6..f90e2019 100644 --- a/src/main/java/com/replaymod/render/blend/Exporter.java +++ b/src/main/java/com/replaymod/render/blend/Exporter.java @@ -3,8 +3,15 @@ import java.io.IOException; public interface Exporter { - default void setup() throws IOException {} - default void tearDown() throws IOException {} - default void preFrame(int frame) throws IOException {} - default void postFrame(int frame) throws IOException {} + default void setup() throws IOException { + } + + default void tearDown() throws IOException { + } + + default void preFrame(int frame) throws IOException { + } + + default void postFrame(int frame) throws IOException { + } } diff --git a/src/main/java/com/replaymod/render/blend/ToJson.java b/src/main/java/com/replaymod/render/blend/ToJson.java index 063e0d41..0ac8646c 100644 --- a/src/main/java/com/replaymod/render/blend/ToJson.java +++ b/src/main/java/com/replaymod/render/blend/ToJson.java @@ -102,8 +102,8 @@ private static void addBlock(JSONArray aBlocks, Block b) throws JSONCodecExcepti private static String toHexStr(byte[] buffer) { StringBuffer str = new StringBuffer(); for (byte v : buffer) { - String s = Integer.toHexString(v&0xff); - if (s.length() == 1) s = "0"+s; + String s = Integer.toHexString(v & 0xff); + if (s.length() == 1) s = "0" + s; str.append(s); } @@ -144,11 +144,11 @@ private static Object createStruct(Block b, int index, CStruct struct) { private static Object toJson(Class type, Object value) throws Throwable { try { - assert(value != null); + assert (value != null); if (isPrimitive(type)) { return codec.encodeObjectJSON(value); - } else if (value instanceof CArrayFacade){ - CArrayFacade carray = ((CArrayFacade)value); + } else if (value instanceof CArrayFacade) { + CArrayFacade carray = ((CArrayFacade) value); JSONArray array = new JSONArray(); boolean hasString = false; for (int i = 0; i < carray.length(); i++) { @@ -167,7 +167,7 @@ private static Object toJson(Class type, Object value) throws Throwable { return array; } } else if (value instanceof CPointer) { - return ((CPointer)value).getAddress(); + return ((CPointer) value).getAddress(); } else if (value instanceof CFacade) { JSONObject oStruct = new JSONObject(); try { @@ -181,7 +181,7 @@ private static Object toJson(Class type, Object value) throws Throwable { } catch (InvocationTargetException e) { Throwable cause = e.getCause(); if (cause instanceof NullPointerException) { - throw (NullPointerException)cause; + throw (NullPointerException) cause; } else { throw e; } diff --git a/src/main/java/com/replaymod/render/blend/Util.java b/src/main/java/com/replaymod/render/blend/Util.java index cff8b6d2..714e4d3c 100644 --- a/src/main/java/com/replaymod/render/blend/Util.java +++ b/src/main/java/com/replaymod/render/blend/Util.java @@ -8,6 +8,7 @@ import net.minecraft.client.renderer.GLAllocation; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.vector.Vector3d; import org.blender.dna.Link; import org.blender.dna.ListBase; import org.blender.utils.BlenderFactory; @@ -17,10 +18,6 @@ import java.io.IOException; import java.nio.FloatBuffer; -//#if MC>=11400 -import net.minecraft.util.math.vector.Vector3d; -//#endif - public class Util { public static BlenderFactory factory() { return BlendState.getState().getFactory(); @@ -40,13 +37,10 @@ public static int align(int size, int alignment) { } private static FloatBuffer floatBuffer = GLAllocation.createDirectFloatBuffer(16); + public static Matrix4f getGlMatrix(int matrix) { floatBuffer.clear(); - //#if MC>=11400 GL11.glGetFloatv(matrix, floatBuffer); - //#else - //$$ GL11.glGetFloat(matrix, floatBuffer); - //#endif floatBuffer.rewind(); Matrix4f mat = new Matrix4f(); mat.load(floatBuffer); @@ -136,21 +130,11 @@ public static void glToBlend(Quaternion q) { q.w = -q.w; } - //#if MC>=10800 public static Vector3f getCameraPos() { Minecraft mc = Minecraft.getInstance(); - //#if MC>=11400 Vector3d pos = mc.getRenderManager().info.getProjectedView(); return new Vector3f((float) pos.x, (float) pos.y, (float) pos.z); - //#else - //$$ return new Vector3f( - //$$ (float) -mc.getRenderManager().viewerPosX, - //$$ (float) -mc.getRenderManager().viewerPosY, - //$$ (float) -mc.getRenderManager().viewerPosZ - //$$ ); - //#endif } - //#endif public static Vector3f rotate(Quaternion rot, Vector3f vec, Vector3f dest) { if (dest == null) dest = new Vector3f(); @@ -184,11 +168,7 @@ public static void insert(ListBase list, CPointer element) throws IOExcept public static String getTileEntityId(TileEntity tileEntity) { CompoundNBT nbt = new CompoundNBT(); - //#if MC>=11400 tileEntity.write(nbt); - //#else - //$$ tileEntity.writeToNBT(nbt); - //#endif return nbt.getString("id"); } diff --git a/src/main/java/com/replaymod/render/blend/data/DMesh.java b/src/main/java/com/replaymod/render/blend/data/DMesh.java index 677f8ad8..ebece384 100644 --- a/src/main/java/com/replaymod/render/blend/data/DMesh.java +++ b/src/main/java/com/replaymod/render/blend/data/DMesh.java @@ -2,19 +2,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector2f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import org.blender.dna.CustomData; -import org.blender.dna.CustomDataLayer; -import org.blender.dna.Image; -import org.blender.dna.MEdge; -import org.blender.dna.MFace; -import org.blender.dna.MLoop; -import org.blender.dna.MLoopCol; -import org.blender.dna.MLoopUV; -import org.blender.dna.MPoly; -import org.blender.dna.MTexPoly; -import org.blender.dna.MVert; -import org.blender.dna.Material; -import org.blender.dna.Mesh; +import org.blender.dna.*; import org.cakelab.blender.io.block.BlockCodes; import org.cakelab.blender.nio.CArrayFacade; import org.cakelab.blender.nio.CPointer; @@ -158,10 +146,10 @@ public void addTriangle(DMesh.Vertex v1, DMesh.Vertex v2, DMesh.Vertex v3, vertices.add(v1); vertices.add(v2); vertices.add(v3); - edges.add(new Edge(vOffset , vOffset + 1)); + edges.add(new Edge(vOffset, vOffset + 1)); edges.add(new Edge(vOffset + 1, vOffset + 2)); - edges.add(new Edge(vOffset + 2, vOffset )); - loops.add(new Loop(vOffset , eOffset , uv1.x, uv1.y, c1)); + edges.add(new Edge(vOffset + 2, vOffset)); + loops.add(new Loop(vOffset, eOffset, uv1.x, uv1.y, c1)); loops.add(new Loop(vOffset + 1, eOffset + 1, uv2.x, uv2.y, c2)); loops.add(new Loop(vOffset + 2, eOffset + 2, uv3.x, uv3.y, c3)); polys.add(new Poly(lOffset, 3, materialSlot)); @@ -178,11 +166,11 @@ public void addQuad(DMesh.Vertex v1, DMesh.Vertex v2, DMesh.Vertex v3, DMesh.Ver vertices.add(v2); vertices.add(v3); vertices.add(v4); - edges.add(new Edge(vOffset , vOffset + 1)); + edges.add(new Edge(vOffset, vOffset + 1)); edges.add(new Edge(vOffset + 1, vOffset + 2)); edges.add(new Edge(vOffset + 2, vOffset + 3)); - edges.add(new Edge(vOffset + 3, vOffset )); - loops.add(new Loop(vOffset , eOffset , uv1.x, uv1.y, c1)); + edges.add(new Edge(vOffset + 3, vOffset)); + loops.add(new Loop(vOffset, eOffset, uv1.x, uv1.y, c1)); loops.add(new Loop(vOffset + 1, eOffset + 1, uv2.x, uv2.y, c2)); loops.add(new Loop(vOffset + 2, eOffset + 2, uv3.x, uv3.y, c3)); loops.add(new Loop(vOffset + 3, eOffset + 3, uv4.x, uv4.y, c4)); @@ -276,8 +264,8 @@ public void serialize(MLoopUV mLoop) throws IOException { } public void serialize(MLoopCol mLoop) throws IOException { - mLoop.setR((byte) ((col ) & 0xff)); - mLoop.setG((byte) ((col >> 8) & 0xff)); + mLoop.setR((byte) ((col) & 0xff)); + mLoop.setG((byte) ((col >> 8) & 0xff)); mLoop.setB((byte) ((col >> 16) & 0xff)); mLoop.setA((byte) ((col >> 24) & 0xff)); } diff --git a/src/main/java/com/replaymod/render/blend/data/DObject.java b/src/main/java/com/replaymod/render/blend/data/DObject.java index c375dfc3..55e568de 100644 --- a/src/main/java/com/replaymod/render/blend/data/DObject.java +++ b/src/main/java/com/replaymod/render/blend/data/DObject.java @@ -3,13 +3,7 @@ import com.replaymod.render.blend.Util; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Quaternion; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import org.blender.dna.AnimData; -import org.blender.dna.BlenderObject; -import org.blender.dna.Material; -import org.blender.dna.Mesh; -import org.blender.dna.bAction; -import org.blender.dna.bConstraint; -import org.blender.dna.bTrackToConstraint; +import org.blender.dna.*; import org.cakelab.blender.io.block.BlockCodes; import org.cakelab.blender.nio.CArrayFacade; import org.cakelab.blender.nio.CPointer; diff --git a/src/main/java/com/replaymod/render/blend/data/DPackedFile.java b/src/main/java/com/replaymod/render/blend/data/DPackedFile.java index a5460827..25415051 100644 --- a/src/main/java/com/replaymod/render/blend/data/DPackedFile.java +++ b/src/main/java/com/replaymod/render/blend/data/DPackedFile.java @@ -8,7 +8,8 @@ public class DPackedFile { public byte[] data; - public DPackedFile() {} + public DPackedFile() { + } public DPackedFile(byte[] data) { this.data = data; diff --git a/src/main/java/com/replaymod/render/blend/data/DScene.java b/src/main/java/com/replaymod/render/blend/data/DScene.java index ad5d8e23..2d4588ae 100644 --- a/src/main/java/com/replaymod/render/blend/data/DScene.java +++ b/src/main/java/com/replaymod/render/blend/data/DScene.java @@ -1,10 +1,6 @@ package com.replaymod.render.blend.data; -import org.blender.dna.Base; -import org.blender.dna.BlenderObject; -import org.blender.dna.RenderData; -import org.blender.dna.Scene; -import org.blender.dna.ToolSettings; +import org.blender.dna.*; import org.cakelab.blender.io.block.BlockCodes; import org.cakelab.blender.nio.CPointer; diff --git a/src/main/java/com/replaymod/render/blend/data/Serializer.java b/src/main/java/com/replaymod/render/blend/data/Serializer.java index fb54292e..588515a9 100644 --- a/src/main/java/com/replaymod/render/blend/data/Serializer.java +++ b/src/main/java/com/replaymod/render/blend/data/Serializer.java @@ -14,9 +14,7 @@ import java.io.IOException; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; import static com.replaymod.render.blend.Util.align4; import static com.replaymod.render.blend.Util.factory; diff --git a/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java index b744aa9a..e229a285 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java @@ -1,175 +1 @@ // FIXME 1.15 -//#if MC>=10800 && MC<11500 -//$$ package com.replaymod.render.blend.exporters; -//$$ -//$$ import com.replaymod.core.versions.MCVer; -//$$ import com.replaymod.render.blend.BlendMeshBuilder; -//$$ import com.replaymod.render.blend.BlendState; -//$$ import com.replaymod.render.blend.Exporter; -//$$ import com.replaymod.render.blend.data.DMesh; -//$$ import com.replaymod.render.blend.data.DObject; -//$$ import com.replaymod.render.blend.mixin.ContainerLocalRenderInformationAccessor; -//$$ import com.replaymod.render.blend.mixin.WorldRendererAccessor; -//$$ import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -//$$ import net.minecraft.client.MinecraftClient; -//$$ import net.minecraft.client.texture.SpriteAtlasTexture; -//$$ import net.minecraft.client.util.GlAllocationUtils; -//$$ import com.mojang.blaze3d.platform.GLX; -//$$ import net.minecraft.client.render.chunk.ChunkRenderData; -//$$ import net.minecraft.client.render.chunk.ChunkRenderer; -//$$ import net.minecraft.client.render.VertexFormats; -//$$ import net.minecraft.client.gl.VertexBuffer; -//$$ import org.apache.commons.lang3.tuple.Pair; -//$$ import org.lwjgl.opengl.GL11; -//$$ import org.lwjgl.opengl.GL15; -//$$ -//#if MC>=10904 -//$$ import net.minecraft.client.render.RenderLayer; -//$$ import net.minecraft.util.math.BlockPos; -//#else -//$$ import net.minecraft.util.BlockPos; -//$$ import net.minecraft.util.EnumWorldBlockLayer; -//#endif -//$$ -//$$ import java.io.IOException; -//$$ import java.nio.ByteBuffer; -//$$ import java.util.ArrayList; -//$$ import java.util.EnumMap; -//$$ import java.util.HashMap; -//$$ import java.util.List; -//$$ import java.util.Map; -//$$ -//$$ public class ChunkExporter implements Exporter { -//$$ private final Map chunkObjects = new HashMap<>(); - //#if MC>=10904 - //$$ private final Map> chunkLayerObjects = new HashMap<>(); - //$$ private final List> chunks = new ArrayList<>(); - //#else - //$$ private final Map> chunkLayerObjects = new HashMap<>(); - //$$ private final List> chunks = new ArrayList<>(); - //#endif -//$$ private DObject chunksObject; -//$$ private int frame; -//$$ -//$$ public void addChunkUpdate(ChunkRenderer chunk, ChunkRenderData compiledChunk) { - //#if MC>=10904 - //$$ for (RenderLayer layer : RenderLayer.values()) { - //#else - //$$ for (EnumWorldBlockLayer layer : EnumWorldBlockLayer.values()) { - //#endif -//$$ if (compiledChunk == null || compiledChunk.isBufferInitialized(layer)) { -//$$ chunks.add(Pair.of(chunk, layer)); -//$$ } -//$$ } -//$$ } -//$$ -//$$ @Override -//$$ public void setup() throws IOException { -//$$ -//$$ MinecraftClient mc = MCVer.getMinecraft(); -//$$ @SuppressWarnings("unchecked") -//$$ List renderInfos = ((WorldRendererAccessor) mc.worldRenderer).getRenderInfos(); -//$$ for (ContainerLocalRenderInformationAccessor renderInfo : renderInfos) { -//$$ ChunkRenderer renderChunk = renderInfo.getRenderChunk(); -//$$ ChunkRenderData compiledChunk = renderChunk.getData(); -//$$ if (!compiledChunk.isEmpty()) { -//$$ addChunkUpdate(renderChunk, null); -//$$ } -//$$ } -//$$ -//$$ chunksObject = new DObject(DObject.Type.OB_EMPTY); -//$$ chunksObject.id.name = "Chunks"; -//$$ chunksObject.layers = 1 << 1; -//$$ BlendState.getState().getScene().base.add(chunksObject); -//$$ } -//$$ -//$$ @Override -//$$ public void tearDown() throws IOException { -//$$ chunks.clear(); -//$$ chunkObjects.clear(); -//$$ chunksObject = null; -//$$ } -//$$ -//$$ @Override -//$$ public void preFrame(int frame) throws IOException { -//$$ this.frame = frame; -//$$ } -//$$ -//$$ @Override -//$$ public void postFrame(int frame) throws IOException { - //#if MC>=10904 - //$$ for (Pair pair : chunks) { - //$$ RenderLayer layer = pair.getRight(); - //#else - //$$ for (Pair pair : chunks) { - //$$ EnumWorldBlockLayer layer = pair.getRight(); - //#endif -//$$ ChunkRenderer chunk = pair.getLeft(); -//$$ DObject chunkObject = chunkObjects.get(chunk.getOrigin()); -//$$ if (chunkObject == null) { -//$$ chunkObject = buildChunkObject(chunk); -//$$ chunkObjects.put(chunk.getOrigin(), chunkObject); -//$$ chunkLayerObjects.put(chunk.getOrigin(), new EnumMap<>(layer.getDeclaringClass())); -//$$ } -//$$ DObject layerObject = buildChunkLayerObject(chunkObject, chunk, layer); -//$$ if (layerObject == null) continue; - //#if MC>=10904 - //$$ Map layerObjects - //#else - //$$ Map layerObjects - //#endif -//$$ = chunkLayerObjects.get(chunk.getOrigin()); -//$$ DObject oldLayerObject = layerObjects.get(layer); -//$$ if (oldLayerObject != null) { -//$$ oldLayerObject.keyframe("hide", 0, frame, 1f); -//$$ } -//$$ if (frame > 0) { -//$$ layerObject.keyframe("hide", 0, frame - 1, 1f); -//$$ layerObject.keyframe("hide", 0, frame, 0f); -//$$ } else { -//$$ layerObject.keyframe("hide", 0, frame, 0f); -//$$ } -//$$ layerObjects.put(layer, layerObject); -//$$ } -//$$ chunks.clear(); -//$$ } -//$$ -//$$ private DObject buildChunkObject(ChunkRenderer renderChunk) { -//$$ BlockPos pos = renderChunk.getOrigin(); -//$$ DObject chunkObject = new DObject(DObject.Type.OB_EMPTY); -//$$ chunkObject.setParent(chunksObject); -//$$ chunkObject.id.name = "Chunk[" + pos.getX()/16 + "/" + pos.getY()/16 + "/" + pos.getZ()/16 + "]"; -//$$ chunkObject.loc = new Vector3f(pos.getX(), -pos.getZ(), pos.getY()); -//$$ return chunkObject; -//$$ } -//$$ -//$$ private DObject buildChunkLayerObject(DObject chunkObject, ChunkRenderer renderChunk, - //#if MC>=10904 - //$$ RenderLayer layer) { - //#else - //$$ EnumWorldBlockLayer layer) { - //#endif -//$$ VertexBuffer vertexBuffer = renderChunk.getGlBuffer(layer.ordinal()); -//$$ if (vertexBuffer == null) return null; -//$$ -//$$ DObject layerObject = new DObject(buildChunkLayerMesh(vertexBuffer)); -//$$ layerObject.setParent(chunkObject); -//$$ layerObject.id.name = chunkObject.id.name + " - " + layer + " - Frame " + frame; -//$$ return layerObject; -//$$ } -//$$ -//$$ private DMesh buildChunkLayerMesh(VertexBuffer vertexBuffer) { -//$$ vertexBuffer.bind(); -//$$ int size = GL15.glGetBufferParameteri(GLX.GL_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE); -//$$ ByteBuffer byteBuffer = GlAllocationUtils.allocateByteBuffer(size); -//$$ GL15.glGetBufferSubData(GLX.GL_ARRAY_BUFFER, 0, byteBuffer); -//$$ vertexBuffer.unbind(); -//$$ -//$$ MCVer.getMinecraft().getTextureManager().bindTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEX); -//$$ -//$$ return BlendMeshBuilder.addBufferToMesh(byteBuffer, GL11.GL_QUADS, VertexFormats.POSITION_COLOR_UV_LMAP, null, null); -//$$ } -//$$ -//$$ private static final int STRIDE = 28; -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/render/blend/exporters/EntityExporter.java b/src/main/java/com/replaymod/render/blend/exporters/EntityExporter.java index b0dbc09c..4c244c13 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/EntityExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/EntityExporter.java @@ -1,4 +1,3 @@ -//#if MC>=10800 package com.replaymod.render.blend.exporters; import com.replaymod.core.versions.MCVer; @@ -55,11 +54,7 @@ public void preRender(Entity entity, double dx, double dy, double dz, float yaw, if (entityObject == null) { entityObject = new DObject(DObject.Type.OB_EMPTY); entityObject.setParent(renderState.peekObject()); - //#if MC>=11400 entityObject.id.name = entity.getName().getString(); - //#else - //$$ entityObject.id.name = entity.getName(); - //#endif entityObjects.put(entity, entityObject); } renderState.pushObject(entityObject); @@ -93,4 +88,3 @@ public void postRender(Entity entity, double dx, double dy, double dz, float yaw renderState.pop(); } } -//#endif diff --git a/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java index 27e95d29..212594c3 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java @@ -1,37 +1,17 @@ -//#if MC>=10800 package com.replaymod.render.blend.exporters; +import com.replaymod.mixin.ItemRendererAccessor; import com.replaymod.render.blend.BlendMeshBuilder; import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DObject; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import org.lwjgl.opengl.GL11; -//#if MC>=11400 -import net.minecraft.util.math.vector.Vector3i; -//#else -//$$ import net.minecraftforge.client.model.pipeline.LightUtil; -//#endif - -//#if MC>=11400 -import net.minecraft.client.renderer.model.BakedQuad; -import net.minecraft.client.renderer.model.IBakedModel; -//#else -//$$ import net.minecraft.client.renderer.block.model.BakedQuad; -//#if MC>=10904 -//$$ import net.minecraft.client.renderer.block.model.IBakedModel; -//#else -//$$ import net.minecraft.client.resources.model.IBakedModel; -//#endif -//#endif - -//#if MC>=10904 -import com.replaymod.mixin.ItemRendererAccessor; -//#endif - import java.util.List; import java.util.Random; @@ -69,11 +49,7 @@ private DObject getObjectForItemStack(Object renderItem, IBakedModel model, Item } if (object == null) { object = new ItemBasedDObject(renderItem, model, stack); - //#if MC>=11400 object.id.name = stack.getDisplayName().getString(); - //#else - //$$ object.id.name = stack.getDisplayName(); - //#endif object.setParent(parent); } object.lastFrame = frame; @@ -85,31 +61,12 @@ private static DMesh generateMeshForItemStack(Object renderItem, IBakedModel mod DMesh mesh = new DMesh(); BlendMeshBuilder builder = new BlendMeshBuilder(mesh); builder.setWellBehaved(true); - //#if MC>=10809 builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - //#else - //$$ builder.startDrawingQuads(); - //$$ builder.setVertexFormat(DefaultVertexFormats.ITEM); - //#endif - //#if MC>=11400 for (Direction face : Direction.values()) { renderQuads(renderItem, builder, model.getQuads(null, face, new Random()), stack); } renderQuads(renderItem, builder, model.getQuads(null, null, new Random()), stack); - //#else - //#if MC>=10904 - //$$ for (EnumFacing face : EnumFacing.values()) { - //$$ renderQuads(renderItem, builder, model.getQuads(null, face, 0), stack); - //$$ } - //$$ renderQuads(renderItem, builder, model.getQuads(null, null, 0), stack); - //#else - //$$ for (EnumFacing face : EnumFacing.values()) { - //$$ renderQuads(renderItem, builder, model.getFaceQuads(face), stack); - //$$ } - //$$ renderQuads(renderItem, builder, model.getGeneralQuads(), stack); - //#endif - //#endif builder.finishDrawing(); return mesh; @@ -118,24 +75,9 @@ private static DMesh generateMeshForItemStack(Object renderItem, IBakedModel mod private static void renderQuads(Object renderItem, BlendMeshBuilder buffer, List quads, ItemStack stack) { for (BakedQuad quad : quads) { int color = stack != null && quad.hasTintIndex() - //#if MC>=10904 ? ((ItemRendererAccessor) renderItem).getItemColors().getColor(stack, quad.getTintIndex()) | 0xff000000 - //#else - //$$ ? stack.getItem().getColorFromItemStack(stack, quad.getTintIndex()) | 0xff000000 - //#endif : 0xffffffff; - //#if MC>=11500 // FIXME 1.15 - //#else - //#if MC>=11400 - //$$ buffer.putVertexData(quad.getVertexData()); - //$$ buffer.setQuadColor(color); - //$$ Vec3i vec3i_1 = quad.getFace().getVector(); - //$$ buffer.postNormal(vec3i_1.getX(), vec3i_1.getY(), vec3i_1.getZ()); - //#else - //$$ LightUtil.renderQuadColor(buffer, quad, color); - //#endif - //#endif } } @@ -169,4 +111,3 @@ public boolean isValid() { } } } -//#endif diff --git a/src/main/java/com/replaymod/render/blend/exporters/ModelRendererExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ModelRendererExporter.java index 580e9d62..12745e00 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ModelRendererExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ModelRendererExporter.java @@ -1,23 +1,11 @@ -//#if MC>=10800 package com.replaymod.render.blend.exporters; import com.replaymod.render.blend.BlendMeshBuilder; import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DObject; -import org.lwjgl.opengl.GL11; - -//#if MC>=11400 -//#if MC>=11500 -import net.minecraft.client.renderer.model.ModelRenderer.ModelBox; -//#else -//$$ import net.minecraft.client.model.Box; -//#endif import net.minecraft.client.renderer.model.ModelRenderer; -//#else -//$$ import net.minecraft.client.model.ModelBox; -//$$ import net.minecraft.client.model.ModelRenderer; -//#endif +import org.lwjgl.opengl.GL11; import java.io.IOException; @@ -70,11 +58,7 @@ private DObject getObjectForModel(ModelRenderer model, float scale) { } if (object == null) { object = new ModelBasedDObject(model, scale); - //#if MC>=11500 object.id.name = "???"; // FIXME 1.15 can we somehow nicely derive this? - //#else - //$$ object.id.name = model.name; - //#endif object.setParent(parent); } object.lastFrame = frame; @@ -84,17 +68,7 @@ private DObject getObjectForModel(ModelRenderer model, float scale) { private static DMesh generateMesh(ModelRenderer model, float scale) { DMesh mesh = new DMesh(); BlendMeshBuilder builder = new BlendMeshBuilder(mesh); - //#if MC>=11500 // FIXME 1.15 - //#elseif MC>=10809 - //$$ for (Box box : model.boxes) { - //$$ box.render(builder, scale); - //$$ } - //#else - //$$ for (ModelBox box : (java.util.List) model.cubeList) { - //$$ box.render(builder, scale); - //$$ } - //#endif builder.maybeFinishDrawing(); return mesh; } @@ -126,4 +100,3 @@ public boolean isValid() { } } } -//#endif diff --git a/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java index 6c63603a..6e456b56 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java @@ -1,31 +1,17 @@ -//#if MC>=10800 package com.replaymod.render.blend.exporters; import com.replaymod.core.versions.MCVer; +import com.replaymod.mixin.ParticleAccessor; import com.replaymod.render.blend.BlendMeshBuilder; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DObject; -import com.replaymod.mixin.ParticleAccessor; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Matrix4f; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; import net.minecraft.client.Minecraft; - -//#if MC>=11400 -import net.minecraft.util.math.vector.Vector3d; -//#endif - -//#if MC>=10904 import net.minecraft.client.particle.Particle; -//#else -//$$ import net.minecraft.client.particle.EntityFX; -//$$ import net.minecraft.entity.Entity; -//#endif - -//#if MC>=10809 import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -//#endif import java.io.IOException; import java.util.IdentityHashMap; @@ -40,13 +26,8 @@ public class ParticlesExporter implements Exporter { private DObject pointAtObject; private DObject particlesObject; private DObject litParticlesObject; - //#if MC>=10904 private Map particleObjects; private Map particleObjectsSeen; - //#else - //$$ private Map particleObjects; - //$$ private Map particleObjectsSeen; - //#endif public ParticlesExporter(RenderState renderState) { this.renderState = renderState; @@ -87,11 +68,7 @@ public void postParticlesRender() { renderState.pop(); } - //#if MC>=10904 public void onRender(Particle particle, float renderPartialTicks) { - //#else - //$$ public void onRender(EntityFX particle, float renderPartialTicks) { - //#endif DObject particleObject = particleObjects.get(particle); if (particleObject == null) { particleObject = new DObject(DObject.Type.OB_EMPTY); // mesh generation is delayed, see below @@ -116,13 +93,7 @@ public void onRender(Particle particle, float renderPartialTicks) { double dx = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * renderPartialTicks; double dy = acc.getPrevPosY() + (acc.getPosY() - acc.getPrevPosY()) * renderPartialTicks; double dz = acc.getPrevPosZ() + (acc.getPosZ() - acc.getPrevPosZ()) * renderPartialTicks; - //#if MC>=11500 // FIXME 1.15 is this still required? - //#else - //$$ dx -= Particle.cameraX; - //$$ dy -= Particle.cameraY; - //$$ dz -= Particle.cameraZ; - //#endif Vector3f offset = new Vector3f((float) dx, (float) dy, (float) dz); Matrix4f.translate(offset, modelView, modelView); renderState.pushModelView(modelView); @@ -159,35 +130,16 @@ public void onRender(Particle particle, float renderPartialTicks) { renderState.pop(); } - //#if MC>=10904 private DMesh generateMeshForParticle(Particle particle, Vector3f offset) { - //#else - //$$ private DMesh generateMeshForParticle(EntityFX particle, Vector3f offset) { - //#endif DMesh mesh = new DMesh(); BlendMeshBuilder builder = new BlendMeshBuilder(mesh); builder.setReverseOffset(offset); builder.setWellBehaved(true); - //#if MC>=10809 builder.begin(7, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP); - //#else - //$$ builder.startDrawingQuads(); - //#endif - //#if MC>=10809 particle.renderParticle(builder, - //#if MC>=11400 MCVer.getMinecraft().gameRenderer.getActiveRenderInfo(), - //#else - //$$ MCVer.getMinecraft().getRenderViewEntity(), - //#endif 0 - //#if MC<11500 - //$$ , 1, 1, 0, 0, 0 - //#endif ); - //#else - //$$ particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0); - //#endif builder.finishDrawing(); return mesh; } @@ -201,4 +153,3 @@ public void postFrame(int frame) throws IOException { particleObjectsSeen = new IdentityHashMap<>(); } } -//#endif diff --git a/src/main/java/com/replaymod/render/blend/exporters/RenderState.java b/src/main/java/com/replaymod/render/blend/exporters/RenderState.java index 9f385ce3..bf4db718 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/RenderState.java +++ b/src/main/java/com/replaymod/render/blend/exporters/RenderState.java @@ -1,4 +1,3 @@ -//#if MC>=10800 package com.replaymod.render.blend.exporters; import com.replaymod.render.blend.BlendState; @@ -13,13 +12,7 @@ import java.util.LinkedList; import static com.replaymod.render.ReplayModRender.LOGGER; -import static com.replaymod.render.blend.Util.getGlModelViewMatrix; -import static com.replaymod.render.blend.Util.glScaleToBlend; -import static com.replaymod.render.blend.Util.glToBlend; -import static com.replaymod.render.blend.Util.posFromMat; -import static com.replaymod.render.blend.Util.rotFromMat; -import static com.replaymod.render.blend.Util.scaleFromMat; -import static com.replaymod.render.blend.Util.scaleMat3; +import static com.replaymod.render.blend.Util.*; public class RenderState implements Exporter { @@ -142,4 +135,3 @@ public void tearDown() throws IOException { } } -//#endif diff --git a/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java b/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java index 1c21b18e..d961dbc0 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java @@ -1,4 +1,3 @@ -//#if MC>=10800 package com.replaymod.render.blend.exporters; import com.replaymod.core.versions.MCVer; @@ -9,12 +8,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; import net.minecraft.client.Minecraft; import net.minecraft.tileentity.TileEntity; - -//#if MC>=10904 import net.minecraft.util.math.BlockPos; -//#else -//$$ import net.minecraft.util.BlockPos; -//#endif import java.io.IOException; import java.util.IdentityHashMap; @@ -51,15 +45,9 @@ public void preTileEntitiesRender() { // We however want our TileEntities object to not move when the viewer does, // so we position it at 0/0/0 and instead have the tile entities themselves move more Matrix4f.translate(new Vector3f( - //#if MC>=11400 (float) -mc.getRenderManager().info.getProjectedView().x, (float) -mc.getRenderManager().info.getProjectedView().y, (float) -mc.getRenderManager().info.getProjectedView().z - //#else - //$$ (float) -mc.getRenderManager().viewerPosX, - //$$ (float) -mc.getRenderManager().viewerPosY, - //$$ (float) -mc.getRenderManager().viewerPosZ - //#endif ), modelView, modelView); renderState.push(tileEntitiesObject, modelView); } @@ -112,4 +100,3 @@ public void postFrame(int frame) throws IOException { tileEntityObjectsSeen = new IdentityHashMap<>(); } } -//#endif diff --git a/src/main/java/com/replaymod/render/capturer/CubicOpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/CubicOpenGlFrameCapturer.java index 1beb9b92..da0d8415 100644 --- a/src/main/java/com/replaymod/render/capturer/CubicOpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/CubicOpenGlFrameCapturer.java @@ -12,6 +12,7 @@ public enum Data implements CaptureData { } private final int frameSize; + public CubicOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo, int frameSize) { super(worldRenderer, renderInfo); this.frameSize = frameSize; @@ -32,7 +33,7 @@ protected int getFrameHeight() { public Map process() { float partialTicks = renderInfo.updateForNextFrame(); int frameId = framesDone++; - CubicOpenGlFrame frame = new CubicOpenGlFrame(renderFrame(frameId, partialTicks, Data.LEFT), + CubicOpenGlFrame frame = new CubicOpenGlFrame(renderFrame(frameId, partialTicks, Data.LEFT), renderFrame(frameId, partialTicks, Data.RIGHT), renderFrame(frameId, partialTicks, Data.FRONT), renderFrame(frameId, partialTicks, Data.BACK), diff --git a/src/main/java/com/replaymod/render/capturer/CubicPboOpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/CubicPboOpenGlFrameCapturer.java index 1896b8c0..dd380e36 100644 --- a/src/main/java/com/replaymod/render/capturer/CubicPboOpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/CubicPboOpenGlFrameCapturer.java @@ -7,6 +7,7 @@ public class CubicPboOpenGlFrameCapturer extends PboOpenGlFrameCapturer { private final int frameSize; + public CubicPboOpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo, int frameSize) { super(worldRenderer, renderInfo, CubicOpenGlFrameCapturer.Data.class, frameSize * frameSize); this.frameSize = frameSize; diff --git a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java index 725059d3..0b22328d 100644 --- a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java @@ -1,6 +1,5 @@ package com.replaymod.render.capturer; -import com.replaymod.render.rendering.Channel; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.render.RenderSettings; import com.replaymod.render.frame.CubicOpenGlFrame; @@ -8,6 +7,7 @@ import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.hooks.FogStateCallback; import com.replaymod.render.hooks.Texture2DStateCallback; +import com.replaymod.render.rendering.Channel; import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.shader.Program; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; @@ -15,12 +15,11 @@ import net.minecraft.crash.ReportedException; import net.minecraft.util.ResourceLocation; -import static com.mojang.blaze3d.platform.GlStateManager.*; - import java.io.IOException; import java.util.HashMap; import java.util.Map; +import static com.mojang.blaze3d.platform.GlStateManager.*; import static com.replaymod.core.versions.MCVer.resizeMainWindow; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -40,6 +39,7 @@ public ODSFrameCapturer(WorldRenderer worldRenderer, final RenderInfo renderInfo RenderInfo fakeInfo = new RenderInfo() { private int call; private float partialTicks; + @Override public ReadableDimension getFrameSize() { return renderInfo.getFrameSize(); @@ -84,23 +84,14 @@ public RenderSettings getRenderSettings() { private void bindProgram() { shaderProgram.use(); setTexture("texture", 0); - //#if MC>=11500 setTexture("overlay", 1); setTexture("lightMap", 2); - //#else - //$$ setTexture("lightMap", 1); - //#endif renderStateEvents = new EventRegistrations(); Program.Uniform[] texture2DUniforms = new Program.Uniform[]{ shaderProgram.getUniformVariable("textureEnabled"), - //#if MC>=11500 shaderProgram.getUniformVariable("overlayEnabled"), shaderProgram.getUniformVariable("lightMapEnabled"), - //#else - //$$ shaderProgram.getUniformVariable("lightMapEnabled"), - //$$ shaderProgram.getUniformVariable("overlayEnabled"), - //#endif }; renderStateEvents.on(Texture2DStateCallback.EVENT, (id, enabled) -> { if (id >= 0 && id < texture2DUniforms.length) { @@ -171,9 +162,7 @@ protected OpenGlFrame renderFrame(int frameId, float partialTicks, CubicOpenGlFr frameBuffer().bindFramebuffer(true); clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT - //#if MC>=11400 , false - //#endif ); enableTexture(); diff --git a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java index 79360718..aba409a4 100644 --- a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java @@ -16,12 +16,7 @@ import java.io.IOException; import java.nio.ByteBuffer; -//#if MC>=10800 import static com.mojang.blaze3d.platform.GlStateManager.*; -//#else -//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; -//#endif - import static com.replaymod.core.versions.MCVer.resizeMainWindow; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -87,9 +82,7 @@ protected OpenGlFrame renderFrame(int frameId, float partialTicks, D captureData frameBuffer().bindFramebuffer(true); clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT - //#if MC>=11400 , false - //#endif ); enableTexture(); diff --git a/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java index 6067fa42..1b7ada33 100644 --- a/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java @@ -1,6 +1,5 @@ package com.replaymod.render.capturer; -import com.mojang.blaze3d.platform.GlStateManager; import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.rendering.Channel; import com.replaymod.render.rendering.Frame; diff --git a/src/main/java/com/replaymod/render/capturer/WorldRenderer.java b/src/main/java/com/replaymod/render/capturer/WorldRenderer.java index 11df2a93..2a5216eb 100644 --- a/src/main/java/com/replaymod/render/capturer/WorldRenderer.java +++ b/src/main/java/com/replaymod/render/capturer/WorldRenderer.java @@ -4,5 +4,6 @@ public interface WorldRenderer extends Closeable { void renderWorld(float partialTicks, CaptureData data); + void setOmnidirectional(boolean omnidirectional); } diff --git a/src/main/java/com/replaymod/render/events/ReplayRenderCallback.java b/src/main/java/com/replaymod/render/events/ReplayRenderCallback.java index faed105c..680b153f 100644 --- a/src/main/java/com/replaymod/render/events/ReplayRenderCallback.java +++ b/src/main/java/com/replaymod/render/events/ReplayRenderCallback.java @@ -1,7 +1,7 @@ package com.replaymod.render.events; -import com.replaymod.render.rendering.VideoRenderer; import com.replaymod.gui.utils.Event; +import com.replaymod.render.rendering.VideoRenderer; public interface ReplayRenderCallback { interface Pre { diff --git a/src/main/java/com/replaymod/render/gui/GuiExportFailed.java b/src/main/java/com/replaymod/render/gui/GuiExportFailed.java index 720ab1ae..5e8c7f34 100644 --- a/src/main/java/com/replaymod/render/gui/GuiExportFailed.java +++ b/src/main/java/com/replaymod/render/gui/GuiExportFailed.java @@ -1,8 +1,6 @@ package com.replaymod.render.gui; import com.replaymod.core.ReplayMod; -import com.replaymod.render.RenderSettings; -import com.replaymod.render.FFmpegWriter; import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.container.GuiScreen; import com.replaymod.gui.container.GuiVerticalList; @@ -12,6 +10,8 @@ import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.layout.VerticalLayout; +import com.replaymod.render.FFmpegWriter; +import com.replaymod.render.RenderSettings; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.ReportedException; @@ -62,8 +62,8 @@ public static GuiExportFailed tryToRecover(FFmpegWriter.FFmpegStartupException e setLayout(new CustomLayout() { @Override protected void layout(GuiScreen container, int width, int height) { - pos(info, width/2 - width(info)/2, (height/2 - height(info) - 30) / 2 + 30); - pos(logLabel, width/2 - width(logLabel)/2, height/2 + 4); + pos(info, width / 2 - width(info) / 2, (height / 2 - height(info) - 30) / 2 + 30); + pos(logLabel, width / 2 - width(logLabel) / 2, height / 2 + 4); pos(logList, 10, y(logLabel) + height(logLabel) + 4); size(logList, width - 10 - x(logList), height - 10 - y(logList)); } diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java b/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java index bd602ce8..c1cb43ff 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderQueue.java @@ -4,24 +4,9 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; -import com.replaymod.render.RenderSettings; -import com.replaymod.render.ReplayModRender; -import com.replaymod.render.FFmpegWriter; -import com.replaymod.render.rendering.VideoRenderer; -import com.replaymod.render.utils.RenderJob; -import com.replaymod.replay.ReplayHandler; -import com.replaymod.replay.ReplayModReplay; -import com.replaymod.replay.ReplaySender; -import com.replaymod.replaystudio.pathing.path.Timeline; -import com.replaymod.replaystudio.replay.ReplayFile; -import com.replaymod.replaystudio.us.myles.ViaVersion.api.Pair; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; -import com.replaymod.gui.container.AbstractGuiClickableContainer; -import com.replaymod.gui.container.AbstractGuiScreen; -import com.replaymod.gui.container.GuiContainer; -import com.replaymod.gui.container.GuiPanel; -import com.replaymod.gui.container.GuiVerticalList; +import com.replaymod.gui.container.*; import com.replaymod.gui.element.GuiButton; import com.replaymod.gui.element.GuiElement; import com.replaymod.gui.element.GuiLabel; @@ -32,32 +17,34 @@ import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.popup.AbstractGuiPopup; import com.replaymod.gui.utils.Colors; +import com.replaymod.render.FFmpegWriter; +import com.replaymod.render.RenderSettings; +import com.replaymod.render.ReplayModRender; +import com.replaymod.render.rendering.VideoRenderer; +import com.replaymod.render.utils.RenderJob; +import com.replaymod.replay.ReplayHandler; +import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replay.ReplaySender; +import com.replaymod.replaystudio.pathing.path.Timeline; +import com.replaymod.replaystudio.replay.ReplayFile; +import com.replaymod.replaystudio.us.myles.ViaVersion.api.Pair; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.AlertScreen; import net.minecraft.crash.CrashReport; +import net.minecraft.util.text.TranslationTextComponent; import org.apache.commons.io.IOUtils; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.function.Supplier; import java.util.stream.Collectors; import static com.replaymod.render.ReplayModRender.LOGGER; -//#if MC>=11400 -import net.minecraft.util.text.TranslationTextComponent; -//#else -//$$ import com.replaymod.replaystudio.util.I18n; -//#endif - public class GuiRenderQueue extends AbstractGuiPopup implements Typeable { private final GuiLabel title = new GuiLabel().setI18nText("replaymod.gui.renderqueue.title").setColor(Colors.BLACK); private final GuiVerticalList list = new GuiVerticalList().setDrawShadow(true).setDrawSlider(true); @@ -159,7 +146,8 @@ public GuiRenderQueue(AbstractGuiScreen container, ReplayHandler replayHandle } } } - ReplayMod.instance.runLaterWithoutLock(() -> processQueue(container, replayHandler, renderQueue, () -> {})); + ReplayMod.instance.runLaterWithoutLock(() -> processQueue(container, replayHandler, renderQueue, () -> { + })); }); updateButtons(); @@ -180,14 +168,9 @@ private static void processQueue(AbstractGuiScreen container, ReplayHandler r } catch (FFmpegWriter.NoFFmpegException e) { LOGGER.error("Rendering video:", e); AlertScreen errorScreen = new AlertScreen( - //#if MC>=11400 container::display, new TranslationTextComponent("replaymod.gui.rendering.error.title"), new TranslationTextComponent("replaymod.gui.rendering.error.message") - //#else - //$$ I18n.format("replaymod.gui.rendering.error.title"), - //$$ I18n.format("replaymod.gui.rendering.error.message") - //#endif ); mc.displayGuiScreen(errorScreen); return; @@ -201,7 +184,8 @@ private static void processQueue(AbstractGuiScreen container, ReplayHandler r }); return; } catch (Throwable t) { - Utils.error(LOGGER, container, CrashReport.makeCrashReport(t, "Rendering video"), () -> {}); + Utils.error(LOGGER, container, CrashReport.makeCrashReport(t, "Rendering video"), () -> { + }); container.display(); // Re-show the queue popup and the new error popup return; } @@ -229,7 +213,8 @@ public static void processMultipleReplays( replayFile = mod.getCore().openReplay(next.getKey().toPath()); replayHandler = mod.startReplay(replayFile, true, false); } catch (IOException e) { - Utils.error(LOGGER, container, CrashReport.makeCrashReport(e, "Opening replay"), () -> {}); + Utils.error(LOGGER, container, CrashReport.makeCrashReport(e, "Opening replay"), () -> { + }); container.display(); // Re-show the queue popup and the new error popup IOUtils.closeQuietly(replayFile); return; @@ -259,7 +244,8 @@ public static void processMultipleReplays( try { replayHandler.endReplay(); } catch (IOException e) { - Utils.error(LOGGER, container, CrashReport.makeCrashReport(e, "Closing replay"), () -> {}); + Utils.error(LOGGER, container, CrashReport.makeCrashReport(e, "Closing replay"), () -> { + }); container.display(); // Re-show the queue popup and the new error popup return; } diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java index e0cd4905..e8f62ee9 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderSettings.java @@ -6,18 +6,8 @@ import com.google.gson.InstanceCreator; import com.google.gson.JsonSyntaxException; import com.replaymod.core.ReplayMod; +import com.replaymod.gui.container.*; import com.replaymod.gui.element.GuiTextField; -import com.replaymod.render.RenderSettings; -import com.replaymod.render.ReplayModRender; -import com.replaymod.render.FFmpegWriter; -import com.replaymod.render.rendering.VideoRenderer; -import com.replaymod.replay.ReplayHandler; -import com.replaymod.replaystudio.pathing.path.Timeline; -import com.replaymod.gui.container.AbstractGuiScreen; -import com.replaymod.gui.container.GuiContainer; -import com.replaymod.gui.container.GuiPanel; -import com.replaymod.gui.container.GuiScreen; -import com.replaymod.gui.container.GuiVerticalList; import com.replaymod.gui.element.advanced.GuiColorPicker; import com.replaymod.gui.element.advanced.GuiDropdownMenu; import com.replaymod.gui.layout.CustomLayout; @@ -29,6 +19,12 @@ import com.replaymod.gui.utils.Colors; import com.replaymod.gui.utils.Consumer; import com.replaymod.gui.utils.Utils; +import com.replaymod.render.FFmpegWriter; +import com.replaymod.render.RenderSettings; +import com.replaymod.render.ReplayModRender; +import com.replaymod.render.rendering.VideoRenderer; +import com.replaymod.replay.ReplayHandler; +import com.replaymod.replaystudio.pathing.path.Timeline; import de.johni0702.minecraft.gui.utils.lwjgl.Color; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; @@ -36,6 +32,7 @@ import net.minecraft.client.gui.screen.AlertScreen; import net.minecraft.client.resources.I18n; import net.minecraft.crash.CrashReport; +import net.minecraft.util.text.TranslationTextComponent; import java.io.File; import java.io.FileNotFoundException; @@ -52,12 +49,11 @@ import static com.replaymod.core.utils.Utils.error; import static com.replaymod.render.ReplayModRender.LOGGER; -//#if MC>=11400 -import net.minecraft.util.text.TranslationTextComponent; -//#endif - public class GuiRenderSettings extends AbstractGuiPopup { - { disablePopupBackground(); } + { + disablePopupBackground(); + } + public final GuiPanel contentPanel = new GuiPanel(popup).setBackgroundColor(new Color(0, 0, 0, 230)); public final GuiVerticalList settingsList = new GuiVerticalList(contentPanel).setDrawSlider(true); @@ -244,14 +240,9 @@ public void run() { } catch (FFmpegWriter.NoFFmpegException e) { LOGGER.error("Rendering video:", e); AlertScreen errorScreen = new AlertScreen( - //#if MC>=11400 getScreen()::display, new TranslationTextComponent("replaymod.gui.rendering.error.title"), new TranslationTextComponent("replaymod.gui.rendering.error.message") - //#else - //$$ I18n.format("replaymod.gui.rendering.error.title"), - //$$ I18n.format("replaymod.gui.rendering.error.message") - //#endif ); getMinecraft().displayGuiScreen(errorScreen); } catch (FFmpegWriter.FFmpegStartupException e) { @@ -262,7 +253,8 @@ public void run() { renderButton.onClick(); }); } catch (Throwable t) { - error(LOGGER, GuiRenderSettings.this, CrashReport.makeCrashReport(t, "Rendering video"), () -> {}); + error(LOGGER, GuiRenderSettings.this, CrashReport.makeCrashReport(t, "Rendering video"), () -> { + }); getScreen().display(); // Re-show the render settings gui and the new error popup } } diff --git a/src/main/java/com/replaymod/render/gui/GuiRenderingDone.java b/src/main/java/com/replaymod/render/gui/GuiRenderingDone.java index 4cc0e1cb..ff657c00 100644 --- a/src/main/java/com/replaymod/render/gui/GuiRenderingDone.java +++ b/src/main/java/com/replaymod/render/gui/GuiRenderingDone.java @@ -2,9 +2,6 @@ import com.replaymod.core.SettingsRegistry; import com.replaymod.core.versions.MCVer; -import com.replaymod.render.RenderSettings; -import com.replaymod.render.ReplayModRender; -import com.replaymod.render.Setting; import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.container.GuiScreen; import com.replaymod.gui.element.GuiButton; @@ -13,6 +10,9 @@ import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.layout.VerticalLayout; +import com.replaymod.render.RenderSettings; +import com.replaymod.render.ReplayModRender; +import com.replaymod.render.Setting; import java.io.File; diff --git a/src/main/java/com/replaymod/render/gui/GuiVideoRenderer.java b/src/main/java/com/replaymod/render/gui/GuiVideoRenderer.java index f6b941ed..4856fc22 100644 --- a/src/main/java/com/replaymod/render/gui/GuiVideoRenderer.java +++ b/src/main/java/com/replaymod/render/gui/GuiVideoRenderer.java @@ -1,7 +1,6 @@ package com.replaymod.render.gui; import com.replaymod.core.utils.Utils; -import com.replaymod.render.rendering.VideoRenderer; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiPanel; @@ -13,17 +12,15 @@ import com.replaymod.gui.function.Tickable; import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.HorizontalLayout; +import com.replaymod.render.rendering.VideoRenderer; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.client.renderer.texture.NativeImage; import net.minecraft.client.resources.I18n; import net.minecraft.util.ResourceLocation; -//#if MC>=11400 -import net.minecraft.client.renderer.texture.NativeImage; -//#endif - import java.nio.ByteBuffer; public class GuiVideoRenderer extends GuiScreen implements Tickable { @@ -32,7 +29,7 @@ public class GuiVideoRenderer extends GuiScreen implements Tickable { private final VideoRenderer renderer; public final GuiLabel title = new GuiLabel().setI18nText("replaymod.gui.rendering.title"); - public final GuiPanel imagePanel = new GuiPanel(){ + public final GuiPanel imagePanel = new GuiPanel() { @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { if (previewCheckbox.isChecked()) { @@ -60,7 +57,7 @@ public void run() { } }).setI18nLabel("replaymod.gui.rendering.pause").setSize(150, 20); - public final GuiButton cancelButton = new GuiButton(buttonPanel){ + public final GuiButton cancelButton = new GuiButton(buttonPanel) { boolean waitingForConfirmation; @Override @@ -143,7 +140,7 @@ public void tick() { long current = System.currentTimeMillis(); //first, update the total render time (only if rendering is not paused and has already started) - if(!renderer.isPaused() && renderer.getFramesDone() > 0 && prevTime > -1) { + if (!renderer.isPaused() && renderer.getFramesDone() > 0 && prevTime > -1) { renderTimeTaken += (current - prevTime); } else { //if the rendering process is paused, we have to update the frame start time to prevent huge render times @@ -158,25 +155,25 @@ public void tick() { //calculate estimated time left //if the amount of rendered frames has increased since the last update - if(prevRenderedFrames < renderer.getFramesDone()) { + if (prevRenderedFrames < renderer.getFramesDone()) { //we don't include the first frame in our calculations, //as setting up the rendering process takes a few seconds - if(prevRenderedFrames > 0) { + if (prevRenderedFrames > 0) { //calculate the amount of frames that have been rendered since the last update int framesRendered = renderer.getFramesDone() - prevRenderedFrames; //calculate the time it took to render these frames - int renderTime = (int)(current - frameStartTime); + int renderTime = (int) (current - frameStartTime); //calculate the average time it took for each of these frames to render - int avgRenderTime = renderTime/framesRendered; + int avgRenderTime = renderTime / framesRendered; //add all of the average render times to the render times array - for(int i=0; i= renderTimes.length) currentIndex = 0; + if (currentIndex >= renderTimes.length) currentIndex = 0; } //the renderTimes array initially contains lots of zeros, @@ -184,8 +181,8 @@ public void tick() { int validValues = 0; int totalTime = 0; - for(int i : renderTimes) { - if(i > 0) { + for (int i : renderTimes) { + if (i > 0) { totalTime += i; validValues++; } @@ -204,7 +201,7 @@ public void tick() { prevRenderedFrames = renderer.getFramesDone(); } - renderTime.setText(I18n.format("replaymod.gui.rendering.timetaken") + ": " + secToString(renderTimeTaken/1000)); + renderTime.setText(I18n.format("replaymod.gui.rendering.timetaken") + ": " + secToString(renderTimeTaken / 1000)); remainingTime.setText(I18n.format("replaymod.gui.rendering.timeleft") + ": " + secToString(renderTimeLeft)); int framesDone = renderer.getFramesDone(), framesTotal = renderer.getTotalFrames(); @@ -213,13 +210,13 @@ public void tick() { } private String secToString(int seconds) { - int hours = seconds/(60*60); - int min = seconds/60 - hours*60; - int sec = seconds - ((min*60) + (hours*60*60)); + int hours = seconds / (60 * 60); + int min = seconds / 60 - hours * 60; + int sec = seconds - ((min * 60) + (hours * 60 * 60)); StringBuilder builder = new StringBuilder(); - if(hours > 0) builder.append(hours).append(I18n.format("replaymod.gui.hours")); - if(min > 0 || hours > 0) builder.append(min).append(I18n.format("replaymod.gui.minutes")); + if (hours > 0) builder.append(hours).append(I18n.format("replaymod.gui.hours")); + if (min > 0 || hours > 0) builder.append(min).append(I18n.format("replaymod.gui.minutes")); builder.append(sec).append(I18n.format("replaymod.gui.seconds")); return builder.toString(); @@ -231,11 +228,7 @@ private synchronized void renderPreview(GuiRenderer guiRenderer, ReadableDimensi final int videoHeight = videoSize.getHeight(); if (previewTexture == null) { - //#if MC>=11400 previewTexture = new DynamicTexture(videoWidth, videoHeight, true); - //#else - //$$ previewTexture = new DynamicTexture(videoWidth, videoHeight); - //#endif } if (previewTextureDirty) { @@ -268,12 +261,8 @@ public void updatePreview(ByteBuffer buffer, ReadableDimension size) { if (previewCheckbox.isChecked() && previewTexture != null) { buffer.mark(); synchronized (this) { - //#if MC>=11400 NativeImage data = previewTexture.getTextureData(); assert data != null; - //#else - //$$ int[] data = previewTexture.getTextureData(); - //#endif // Note: Optifine changes the texture data array to be three times as long (for use by shaders), // we only want to initialize the first third and since we use our frame size, not the array size, // we're good to go. @@ -284,13 +273,8 @@ public void updatePreview(ByteBuffer buffer, ReadableDimension size) { int g = buffer.get() & 0xff; int r = buffer.get() & 0xff; buffer.get(); // alpha - //#if MC>=11400 - int value = 0xff << 24 | b << 16 | g << 8 | r; + int value = 0xff << 24 | b << 16 | g << 8 | r; data.setPixelRGBA(x, y, value); // actually takes ABGR, not RGBA - //#else - //$$ int value = 0xff << 24 | r << 16 | g << 8 | b; - //$$ data[y * width + x] = value; - //#endif } } previewTextureDirty = true; diff --git a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java index 4729c7bc..b15ee093 100644 --- a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java +++ b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java @@ -1,29 +1,17 @@ package com.replaymod.render.hooks; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.replaymod.core.events.PostRenderCallback; +import com.replaymod.core.events.PreRenderCallback; import com.replaymod.core.events.PreRenderHandCallback; import com.replaymod.core.versions.MCVer; +import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.render.RenderSettings; import com.replaymod.render.capturer.CaptureData; import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.WorldRenderer; -import com.replaymod.gui.utils.EventRegistrations; import net.minecraft.client.Minecraft; -//#if MC>=11500 -import com.mojang.blaze3d.matrix.MatrixStack; -//#endif - -//#if MC>=11400 -import com.replaymod.core.events.PostRenderCallback; -import com.replaymod.core.events.PreRenderCallback; -//#else -//#if MC>=11400 -//$$ import net.minecraftforge.fml.hooks.BasicEventHooks; -//#else -//$$ import net.minecraftforge.fml.common.FMLCommonHandler; -//#endif -//#endif - import java.io.IOException; public class EntityRendererHandler extends EventRegistrations implements WorldRenderer { @@ -54,33 +42,13 @@ public void renderWorld(final float partialTicks, CaptureData data) { } public void renderWorld(float partialTicks, long finishTimeNano) { - //#if MC>=11400 PreRenderCallback.EVENT.invoker().preRender(); - //#else - //#if MC>=11400 - //$$ BasicEventHooks.onRenderTickStart(partialTicks); - //#else - //$$ FMLCommonHandler.instance().onRenderTickStart(partialTicks); - //#endif - //#endif if (mc.world != null && mc.player != null) { - //#if MC>=11500 mc.gameRenderer.renderWorld(partialTicks, finishTimeNano, new MatrixStack()); - //#else - //$$ mc.gameRenderer.renderWorld(partialTicks, finishTimeNano); - //#endif } - //#if MC>=11400 PostRenderCallback.EVENT.invoker().postRender(); - //#else - //#if MC>=11400 - //$$ BasicEventHooks.onRenderTickEnd(partialTicks); - //#else - //$$ FMLCommonHandler.instance().onRenderTickEnd(partialTicks); - //#endif - //#endif } @Override @@ -104,6 +72,7 @@ public RenderInfo getRenderInfo() { public interface IEntityRenderer { void replayModRender_setHandler(EntityRendererHandler handler); + EntityRendererHandler replayModRender_getHandler(); } } diff --git a/src/main/java/com/replaymod/render/metadata/MetadataInjector.java b/src/main/java/com/replaymod/render/metadata/MetadataInjector.java index 9042eeb0..26f1d9e9 100644 --- a/src/main/java/com/replaymod/render/metadata/MetadataInjector.java +++ b/src/main/java/com/replaymod/render/metadata/MetadataInjector.java @@ -25,20 +25,20 @@ public class MetadataInjector { */ private static final String SPHERICAL_XML_HEADER = " " + - " "; + " "; private static final String SPHERICAL_XML_CONTENTS = "true " + - "true " + - ""+STITCHING_SOFTWARE+" " + - "equirectangular "; + "true " + + "" + STITCHING_SOFTWARE + " " + + "equirectangular "; private static final String SPHERICAL_CROP_XML = "%d " + - "%d " + - "%d " + - "%d " + - "%d " + - "%d "; + "%d " + + "%d " + + "%d " + + "%d " + + "%d "; private static final String STEREO_XML_CONTENTS = "top-bottom"; private static final String SPHERICAL_XML_FOOTER = ""; @@ -51,11 +51,11 @@ public class MetadataInjector { * These bytes are taken from the variable 'spherical_uuid_id' * in https://github.com/google/spatial-media/tree/master/360-Videos-Metadata */ - private static final byte[] UUID_BYTES = new byte[] { - (byte)0xff, (byte)0xcc, (byte)0x82, (byte)0x63, - (byte)0xf8, (byte)0x55, (byte)0x4a, (byte)0x93, - (byte)0x88, (byte)0x14, (byte)0x58, (byte)0x7a, - (byte)0x02, (byte)0x52, (byte)0x1f, (byte)0xdd + private static final byte[] UUID_BYTES = new byte[]{ + (byte) 0xff, (byte) 0xcc, (byte) 0x82, (byte) 0x63, + (byte) 0xf8, (byte) 0x55, (byte) 0x4a, (byte) 0x93, + (byte) 0x88, (byte) 0x14, (byte) 0x58, (byte) 0x7a, + (byte) 0x02, (byte) 0x52, (byte) 0x1f, (byte) 0xdd }; public static void injectMetadata(RenderSettings.RenderMethod renderMethod, File videoFile, @@ -106,12 +106,12 @@ private static void writeMetadata(File videoFile, String metadata) { tempIsoFile = new IsoFile(tempFile.getAbsolutePath()); //first, get the "moov" box from the mp4 - MovieBox moovBox = (MovieBox)getBoxByName(tempIsoFile, "moov"); - if(moovBox == null) throw new IOException("Could not find moov box inside IsoFile"); + MovieBox moovBox = (MovieBox) getBoxByName(tempIsoFile, "moov"); + if (moovBox == null) throw new IOException("Could not find moov box inside IsoFile"); //get the Movie Track to which we will add the Metadata - TrackBox trackBox = (TrackBox)getBoxByName(moovBox, "trak"); - if(trackBox == null) throw new IOException("Could not find trak box inside moov box"); + TrackBox trackBox = (TrackBox) getBoxByName(moovBox, "trak"); + if (trackBox == null) throw new IOException("Could not find trak box inside moov box"); //create a new UserBox, which actually contains the Metadata bytes UserBox metadataBox = new UserBox(new byte[0]); @@ -122,16 +122,16 @@ private static void writeMetadata(File videoFile, String metadata) { //finally, reduce the Video's FreeBox, whose size we will need //to reduce by the Metadata Box's size to preserve the Video's File size - FreeBox freeBox = (FreeBox)getBoxByName(tempIsoFile, "free"); - if(freeBox == null) throw new IOException("Could not find free box inside IsoFile"); + FreeBox freeBox = (FreeBox) getBoxByName(tempIsoFile, "free"); + if (freeBox == null) throw new IOException("Could not find free box inside IsoFile"); - int freeSize = Math.max(0, freeBox.getData().capacity() - (int)metadataBox.getSize()); + int freeSize = Math.max(0, freeBox.getData().capacity() - (int) metadataBox.getSize()); freeBox.setData(ByteBuffer.allocate(freeSize)); //save the ISO file to disk videoFileOutputStream = new FileOutputStream(videoFile); tempIsoFile.getBox(videoFileOutputStream.getChannel()); - } catch(Exception e) { + } catch (Exception e) { LOGGER.error("Spherical Metadata couldn't be injected", e); } finally { IOUtils.closeQuietly(tempIsoFile); @@ -142,9 +142,9 @@ private static void writeMetadata(File videoFile, String metadata) { private static Box getBoxByName(BasicContainer container, String boxName) { for (Box box : container.getBoxes()) { - if(box.getType().equals(boxName)) return box; + if (box.getType().equals(boxName)) return box; } return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/replaymod/render/processor/CubicToBitmapProcessor.java b/src/main/java/com/replaymod/render/processor/CubicToBitmapProcessor.java index 259ccc0c..407eeacd 100644 --- a/src/main/java/com/replaymod/render/processor/CubicToBitmapProcessor.java +++ b/src/main/java/com/replaymod/render/processor/CubicToBitmapProcessor.java @@ -1,7 +1,7 @@ package com.replaymod.render.processor; -import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.frame.BitmapFrame; +import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.utils.ByteBufferPool; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; diff --git a/src/main/java/com/replaymod/render/processor/EquirectangularToBitmapProcessor.java b/src/main/java/com/replaymod/render/processor/EquirectangularToBitmapProcessor.java index 62b78e62..1f18a684 100644 --- a/src/main/java/com/replaymod/render/processor/EquirectangularToBitmapProcessor.java +++ b/src/main/java/com/replaymod/render/processor/EquirectangularToBitmapProcessor.java @@ -1,7 +1,7 @@ package com.replaymod.render.processor; -import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.frame.BitmapFrame; +import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.utils.ByteBufferPool; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import org.apache.commons.lang3.Validate; @@ -81,13 +81,13 @@ public EquirectangularToBitmapProcessor(int outputWidth, int outputHeight, int s double cYN = (Math.tan(pitch) * d + 1) / 2; if (cYN >= 1) { - double pd = Math.tan(PI/2 - pitch); + double pd = Math.tan(PI / 2 - pitch); cXN = (-Math.sin(yaw) * pd + 1) / 2; cYN = (Math.cos(yaw) * pd + 1) / 2; pt = IMAGE_BOTTOM; } if (cYN < 0) { - double pd = Math.tan(PI/2 - pitch); + double pd = Math.tan(PI / 2 - pitch); cXN = (Math.sin(yaw) * pd + 1) / 2; cYN = (Math.cos(yaw) * pd + 1) / 2; pt = IMAGE_TOP; diff --git a/src/main/java/com/replaymod/render/processor/ODSToBitmapProcessor.java b/src/main/java/com/replaymod/render/processor/ODSToBitmapProcessor.java index cff37fa9..bb4b090b 100644 --- a/src/main/java/com/replaymod/render/processor/ODSToBitmapProcessor.java +++ b/src/main/java/com/replaymod/render/processor/ODSToBitmapProcessor.java @@ -1,7 +1,7 @@ package com.replaymod.render.processor; -import com.replaymod.render.frame.ODSOpenGlFrame; import com.replaymod.render.frame.BitmapFrame; +import com.replaymod.render.frame.ODSOpenGlFrame; import com.replaymod.render.utils.ByteBufferPool; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; diff --git a/src/main/java/com/replaymod/render/processor/OpenGlToBitmapProcessor.java b/src/main/java/com/replaymod/render/processor/OpenGlToBitmapProcessor.java index 6cb60f5e..0159bd76 100644 --- a/src/main/java/com/replaymod/render/processor/OpenGlToBitmapProcessor.java +++ b/src/main/java/com/replaymod/render/processor/OpenGlToBitmapProcessor.java @@ -1,7 +1,7 @@ package com.replaymod.render.processor; -import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.frame.BitmapFrame; +import com.replaymod.render.frame.OpenGlFrame; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import java.nio.ByteBuffer; diff --git a/src/main/java/com/replaymod/render/rendering/Pipeline.java b/src/main/java/com/replaymod/render/rendering/Pipeline.java index ec33d8f2..05f8637c 100644 --- a/src/main/java/com/replaymod/render/rendering/Pipeline.java +++ b/src/main/java/com/replaymod/render/rendering/Pipeline.java @@ -1,13 +1,13 @@ package com.replaymod.render.rendering; -import com.replaymod.mixin.MinecraftAccessor; import com.replaymod.core.versions.MCVer; +import com.replaymod.mixin.MinecraftAccessor; import com.replaymod.render.capturer.WorldRenderer; import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.processor.GlToAbsoluteDepthProcessor; import net.minecraft.client.Minecraft; -import net.minecraft.crash.ReportedException; import net.minecraft.crash.CrashReport; +import net.minecraft.crash.ReportedException; import org.lwjgl.glfw.GLFW; import java.util.HashMap; diff --git a/src/main/java/com/replaymod/render/rendering/Pipelines.java b/src/main/java/com/replaymod/render/rendering/Pipelines.java index 62a2b502..ce79616b 100644 --- a/src/main/java/com/replaymod/render/rendering/Pipelines.java +++ b/src/main/java/com/replaymod/render/rendering/Pipelines.java @@ -2,27 +2,10 @@ import com.replaymod.render.RenderSettings; import com.replaymod.render.blend.BlendFrameCapturer; -import com.replaymod.render.capturer.CubicOpenGlFrameCapturer; -import com.replaymod.render.capturer.CubicPboOpenGlFrameCapturer; -import com.replaymod.render.capturer.ODSFrameCapturer; -import com.replaymod.render.capturer.RenderInfo; -import com.replaymod.render.capturer.SimpleOpenGlFrameCapturer; -import com.replaymod.render.capturer.SimplePboOpenGlFrameCapturer; -import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; -import com.replaymod.render.capturer.StereoscopicPboOpenGlFrameCapturer; -import com.replaymod.render.capturer.WorldRenderer; -import com.replaymod.render.frame.CubicOpenGlFrame; -import com.replaymod.render.frame.ODSOpenGlFrame; -import com.replaymod.render.frame.OpenGlFrame; -import com.replaymod.render.frame.BitmapFrame; -import com.replaymod.render.frame.StereoscopicOpenGlFrame; +import com.replaymod.render.capturer.*; +import com.replaymod.render.frame.*; import com.replaymod.render.hooks.EntityRendererHandler; -import com.replaymod.render.processor.CubicToBitmapProcessor; -import com.replaymod.render.processor.DummyProcessor; -import com.replaymod.render.processor.EquirectangularToBitmapProcessor; -import com.replaymod.render.processor.ODSToBitmapProcessor; -import com.replaymod.render.processor.OpenGlToBitmapProcessor; -import com.replaymod.render.processor.StereoscopicToBitmapProcessor; +import com.replaymod.render.processor.*; import com.replaymod.render.utils.PixelBufferObject; import java.util.Map; diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index 33968df8..e3e227f9 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -1,17 +1,16 @@ package com.replaymod.render.rendering; -import com.replaymod.mixin.MinecraftAccessor; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; import com.replaymod.core.MinecraftMethodAccessor; -import com.replaymod.mixin.TimerAccessor; import com.replaymod.core.utils.WrappedTimer; import com.replaymod.core.versions.MCVer; +import com.replaymod.mixin.MainWindowAccessor; +import com.replaymod.mixin.MinecraftAccessor; +import com.replaymod.mixin.TimerAccessor; import com.replaymod.pathing.player.AbstractTimelinePlayer; import com.replaymod.pathing.properties.TimestampProperty; -import com.replaymod.render.CameraPathExporter; -import com.replaymod.render.PNGWriter; -import com.replaymod.render.RenderSettings; -import com.replaymod.render.ReplayModRender; -import com.replaymod.render.FFmpegWriter; +import com.replaymod.render.*; import com.replaymod.render.blend.BlendState; import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.events.ReplayRenderCallback; @@ -20,58 +19,36 @@ import com.replaymod.render.gui.GuiVideoRenderer; import com.replaymod.render.hooks.ForceChunkLoadingHook; import com.replaymod.render.metadata.MetadataInjector; -import com.replaymod.mixin.MainWindowAccessor; 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 de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; +import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; -import net.minecraft.client.shader.Framebuffer; import net.minecraft.client.audio.SimpleSound; -import net.minecraft.client.MainWindow; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.ResourceLocation; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.shader.Framebuffer; import net.minecraft.crash.ReportedException; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; import net.minecraft.util.Timer; import org.lwjgl.glfw.GLFW; - -//#if MC>=11600 -import com.mojang.blaze3d.matrix.MatrixStack; -//#endif - -//#if MC>=11500 -import com.mojang.blaze3d.systems.RenderSystem; import org.lwjgl.opengl.GL11; -//#endif - -//#if MC>=11400 -import com.replaymod.render.EXRWriter; -import net.minecraft.client.gui.screen.Screen; -import java.util.concurrent.CompletableFuture; -//#else -//$$ import org.lwjgl.input.Mouse; -//$$ import org.lwjgl.opengl.Display; -//#endif - -//#if MC>=10800 -import static com.mojang.blaze3d.platform.GlStateManager.*; -//#else -//$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay; -//$$ import static com.replaymod.core.versions.MCVer.GlStateManager.*; -//#endif import java.io.IOException; import java.util.Collection; import java.util.EnumMap; import java.util.Map; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; import static com.google.common.collect.Iterables.getLast; -import static com.replaymod.core.versions.MCVer.*; +import static com.mojang.blaze3d.platform.GlStateManager.*; +import static com.replaymod.core.versions.MCVer.resizeMainWindow; import static com.replaymod.render.ReplayModRender.LOGGER; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -94,9 +71,6 @@ public class VideoRenderer implements RenderInfo { private TimelinePlayer timelinePlayer; private Future timelinePlayerFuture; private ForceChunkLoadingHook forceChunkLoadingHook; - //#if MC<10800 - //$$ private GuiOpeningReplay guiOpeningReplay; - //#endif private int framesDone; private int totalFrames; @@ -122,11 +96,7 @@ public VideoRenderer(RenderSettings settings, ReplayHandler replayHandler, Timel } else { FrameConsumer frameConsumer; if (settings.getEncodingPreset() == RenderSettings.EncodingPreset.EXR) { - //#if MC>=11400 frameConsumer = new EXRWriter(settings.getOutputFile().toPath()); - //#else - //$$ throw new UnsupportedOperationException("EXR requires LWJGL3"); - //#endif } else if (settings.getEncodingPreset() == RenderSettings.EncodingPreset.PNG) { frameConsumer = new PNGWriter(settings.getOutputFile().toPath()); } else { @@ -160,6 +130,7 @@ public void close() throws IOException { /** * Render this video. + * * @return {@code true} if rendering was successful, {@code false} if the user aborted rendering (or the window was closed) */ public boolean renderVideo() throws Throwable { @@ -184,17 +155,9 @@ public boolean renderVideo() throws Throwable { if (videoStart > 1000) { int replayTime = videoStart - 1000; - //#if MC>=11200 timer.renderPartialTicks = 0; ((TimerAccessor) timer).setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK); - //#else - //$$ timer.elapsedPartialTicks = timer.renderPartialTicks = 0; - //$$ timer.timerSpeed = 1; - //#endif while (replayTime < videoStart) { - //#if MC<11600 - //$$ timer.ticksThisFrame = 1; - //#endif replayTime += 50; replayHandler.getReplaySender().sendPacketsTill(replayTime); tick(); @@ -202,9 +165,6 @@ public boolean renderVideo() throws Throwable { } } - //#if MC<11500 - //$$ ((WorldRendererAccessor) mc.worldRenderer).setRenderEntitiesStartupCounter(0); - //#endif renderingPipeline.run(); @@ -252,25 +212,13 @@ public float updateForNextFrame() { // Updating the timer will cause the timeline player to update the game state Timer timer = ((MinecraftAccessor) mc).getTimer(); - //#if MC>=11600 int elapsedTicks = - //#endif - timer.getPartialTicks( - //#if MC>=11400 - MCVer.milliTime() - //#endif - ); - //#if MC<11600 - //$$ int elapsedTicks = timer.ticksThisFrame; - //#endif + timer.getPartialTicks( + MCVer.milliTime() + ); executeTaskQueue(); - //#if MC<10800 - //$$ if (guiOpeningReplay != null) { - //$$ guiOpeningReplay.handleInput(); - //$$ } - //#endif while (elapsedTicks-- > 0) { tick(); @@ -298,26 +246,14 @@ private void setup() { timelinePlayerFuture = timelinePlayer.start(timeline); // FBOs are always used in 1.14+ - //#if MC<11400 - //$$ if (!OpenGlHelper.isFramebufferEnabled()) { - //$$ Display.setResizable(false); - //$$ } - //#endif if (mc.gameSettings.showDebugInfo) { debugInfoWasShown = true; mc.gameSettings.showDebugInfo = false; } - //#if MC>=11400 if (mc.mouseHelper.isMouseGrabbed()) { mouseWasGrabbed = true; } mc.mouseHelper.ungrabMouse(); - //#else - //$$ if (Mouse.isGrabbed()) { - //$$ mouseWasGrabbed = true; - //$$ } - //$$ Mouse.setGrabbed(false); - //#endif // Mute all sounds except GUI sounds (buttons, etc.) originalSoundLevels = new EnumMap<>(SoundCategory.class); @@ -343,7 +279,7 @@ private void setup() { } } - totalFrames = (int) (duration*fps/1000); + totalFrames = (int) (duration * fps / 1000); if (cameraPathExporter != null) { cameraPathExporter.setup(totalFrames); @@ -357,9 +293,7 @@ private void setup() { // Set up our own framebuffer to render the GUI to guiFramebuffer = new Framebuffer(displayWidth, displayHeight, true - //#if MC>=11400 , false - //#endif ); } @@ -371,18 +305,9 @@ private void finish() { timelinePlayer.onTick(); // FBOs are always used in 1.14+ - //#if MC<11400 - //$$ if (!OpenGlHelper.isFramebufferEnabled()) { - //$$ Display.setResizable(true); - //$$ } - //#endif mc.gameSettings.showDebugInfo = debugInfoWasShown; if (mouseWasGrabbed) { - //#if MC>=11400 mc.mouseHelper.grabMouse(); - //#else - //$$ mc.mouseHelper.grabMouseCursor(); - //#endif } for (Map.Entry entry : originalSoundLevels.entrySet()) { mc.gameSettings.setSoundLevel(entry.getKey(), entry.getValue()); @@ -413,7 +338,6 @@ private void finish() { } private void executeTaskQueue() { - //#if MC>=11400 while (true) { while (mc.loadingGui != null) { drawGui(); @@ -429,35 +353,13 @@ private void executeTaskQueue() { break; } ((MinecraftMethodAccessor) mc).replayModExecuteTaskQueue(); - //#else - //$$ Queue> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks(); - //$$ //noinspection SynchronizationOnLocalVariableOrMethodParameter - //$$ synchronized (scheduledTasks) { - //$$ while (!scheduledTasks.isEmpty()) { - //$$ scheduledTasks.poll().run(); - //$$ } - //$$ } - //#endif - - //#if MC<10800 - //$$ if (mc.currentScreen instanceof GuiOpeningReplay) { - //$$ guiOpeningReplay = (GuiOpeningReplay) mc.currentScreen; - //$$ } - //#endif + mc.currentScreen = gui.toMinecraft(); } private void tick() { - //#if MC>=10800 && MC<11400 - //$$ try { - //$$ mc.runTick(); - //$$ } catch (IOException e) { - //$$ throw new RuntimeException(e); - //$$ } - //#else mc.runTick(); - //#endif } public boolean drawGui() { @@ -470,27 +372,18 @@ public boolean drawGui() { // Resize the GUI framebuffer if the display size changed if (displaySizeChanged()) { updateDisplaySize(); - //#if MC>=11400 guiFramebuffer.resize(displayWidth, displayHeight - //#if MC>=11400 , false - //#endif ); - //#else - //$$ guiFramebuffer.createBindFramebuffer(mc.displayWidth, mc.displayHeight); - //#endif } pushMatrix(); clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT - //#if MC>=11400 , false - //#endif ); enableTexture(); guiFramebuffer.bindFramebuffer(true); - //#if MC>=11500 RenderSystem.clear(256, Minecraft.IS_RUNNING_ON_MAC); RenderSystem.matrixMode(GL11.GL_PROJECTION); RenderSystem.loadIdentity(); @@ -498,36 +391,11 @@ public boolean drawGui() { RenderSystem.matrixMode(GL11.GL_MODELVIEW); RenderSystem.loadIdentity(); RenderSystem.translatef(0, 0, -2000); - //#else - //#if MC>=11400 - //$$ window.method_4493( - //#if MC>=11400 - //$$ false - //#endif - //$$ ); - //#else - //$$ mc.entityRenderer.setupOverlayRendering(); - //#endif - //#endif gui.toMinecraft().init(mc, window.getScaledWidth(), window.getScaledHeight()); // Events are polled on 1.13+ in mainWindow.update which is called later - //#if MC<11400 - //#if MC>=10800 - //$$ try { - //$$ gui.toMinecraft().handleInput(); - //$$ } catch (IOException e) { - //$$ // That's a strange exception from this kind of method O_o - //$$ // It isn't actually thrown here, so we'll deal with it the easy way - //$$ throw new RuntimeException(e); - //$$ } - //#else - //$$ gui.toMinecraft().handleInput(); - //#endif - //#endif - - //#if MC>=11400 + int mouseX = (int) mc.mouseHelper.getMouseX() * window.getScaledWidth() / displayWidth; int mouseY = (int) mc.mouseHelper.getMouseY() * window.getScaledHeight() / displayHeight; @@ -536,9 +404,7 @@ public boolean drawGui() { try { mc.currentScreen = gui.toMinecraft(); mc.loadingGui.render( - //#if MC>=11600 new MatrixStack(), - //#endif mouseX, mouseY, 0); } finally { mc.currentScreen = orgScreen; @@ -546,18 +412,9 @@ public boolean drawGui() { } else { gui.toMinecraft().tick(); gui.toMinecraft().render( - //#if MC>=11600 new MatrixStack(), - //#endif mouseX, mouseY, 0); } - //#else - //$$ int mouseX = Mouse.getX() * window.getScaledWidth() / mc.displayWidth; - //$$ int mouseY = window.getScaledHeight() - Mouse.getY() * window.getScaledHeight() / mc.displayHeight - 1; - //$$ - //$$ gui.toMinecraft().updateScreen(); - //$$ gui.toMinecraft().drawScreen(mouseX, mouseY, 0); - //#endif guiFramebuffer.unbindFramebuffer(); popMatrix(); @@ -565,34 +422,10 @@ public boolean drawGui() { guiFramebuffer.framebufferRender(displayWidth, displayHeight); popMatrix(); - //#if MC>=11500 window.flipFrame(); - //#else - //#if MC>=11400 - //$$ window.setFullscreen(false); - //#else - //$$ // if not in high performance mode, update the gui size if screen size changed - //$$ // otherwise just swap the progress gui to screen - //$$ if (settings.isHighPerformance()) { - //$$ Display.update(); - //$$ } else { - //#if MC>=10800 - //$$ mc.updateDisplay(); - //#else - //$$ mc.resetSize(); - //#endif - //$$ } - //#endif - //#endif - //#if MC>=11400 if (mc.mouseHelper.isMouseGrabbed()) { mc.mouseHelper.ungrabMouse(); } - //#else - //$$ if (Mouse.isGrabbed()) { - //$$ Mouse.setGrabbed(false); - //$$ } - //#endif return !hasFailed() && !cancelled; } while (true); @@ -627,7 +460,9 @@ public int getTotalFrames() { return totalFrames; } - public int getVideoTime() { return framesDone * 1000 / fps; } + public int getVideoTime() { + return framesDone * 1000 / fps; + } public void setPaused(boolean paused) { this.paused = paused; @@ -671,15 +506,6 @@ public long getTimePassed() { } public static String[] checkCompat() { - //#if FABRIC>=1 - //$$ if (net.fabricmc.loader.api.FabricLoader.getInstance().isModLoaded("sodium")) { - //$$ return new String[] { - //$$ "Rendering is not currently supported while Sodium is installed.", - //$$ "See https://github.com/ReplayMod/ReplayMod/issues/150", - //$$ "For now, you need to uninstall Sodium before rendering!" - //$$ }; - //$$ } - //#endif return null; } } diff --git a/src/main/java/com/replaymod/render/shader/Program.java b/src/main/java/com/replaymod/render/shader/Program.java index e48900d7..4ae42e4b 100644 --- a/src/main/java/com/replaymod/render/shader/Program.java +++ b/src/main/java/com/replaymod/render/shader/Program.java @@ -1,6 +1,7 @@ package com.replaymod.render.shader; import com.replaymod.core.versions.MCVer; +import net.minecraft.resources.IResource; import net.minecraft.util.ResourceLocation; import org.apache.commons.io.IOUtils; import org.lwjgl.opengl.ARBFragmentShader; @@ -8,12 +9,6 @@ import org.lwjgl.opengl.ARBVertexShader; import org.lwjgl.opengl.GL11; -//#if MC>=11400 -import net.minecraft.resources.IResource; -//#else -//$$ import net.minecraft.client.resources.IResource; -//#endif - import java.io.InputStream; import static org.lwjgl.opengl.ARBShaderObjects.*; @@ -49,7 +44,7 @@ private int createShader(ResourceLocation resourceLocation, int shaderType) thro try { shader = glCreateShaderObjectARB(shaderType); - if(shader == 0) + if (shader == 0) throw new Exception("glCreateShaderObjectARB failed"); IResource resource = MCVer.getMinecraft().getResourceManager().getResource(resourceLocation); @@ -62,8 +57,7 @@ private int createShader(ResourceLocation resourceLocation, int shaderType) thro throw new RuntimeException("Error creating shader: " + getLogInfo(shader)); return shader; - } - catch(Exception exc) { + } catch (Exception exc) { glDeleteObjectARB(shader); throw exc; } diff --git a/src/main/java/com/replaymod/render/utils/JailingQueue.java b/src/main/java/com/replaymod/render/utils/JailingQueue.java index 9fbd14a2..43d0d119 100644 --- a/src/main/java/com/replaymod/render/utils/JailingQueue.java +++ b/src/main/java/com/replaymod/render/utils/JailingQueue.java @@ -6,34 +6,15 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.TimeUnit; - -//#if MC>=10904 import java.util.concurrent.PriorityBlockingQueue; -//#else -//$$ import java.util.AbstractQueue; -//#endif +import java.util.concurrent.TimeUnit; public class JailingQueue - //#if MC>=10904 - extends PriorityBlockingQueue - //#else - //$$ extends AbstractQueue implements BlockingQueue - //#endif -{ - //#if MC>=10904 + extends PriorityBlockingQueue { private final PriorityBlockingQueue delegate; - //#else - //$$ private final BlockingQueue delegate; - //#endif private final Set jailed = new HashSet<>(); - //#if MC>=10904 public JailingQueue(PriorityBlockingQueue delegate) { - //#else - //$$ public JailingQueue(BlockingQueue delegate) { - //#endif this.delegate = delegate; } @@ -82,21 +63,13 @@ public int size() { } @Override - public void put(T t) - //#if MC<10904 - //$$ throws InterruptedException - //#endif - { + public void put(T t) { tryAccess(); delegate.put(t); } @Override - public boolean offer(T t, long timeout, TimeUnit unit) - //#if MC<10904 - //$$ throws InterruptedException - //#endif - { + public boolean offer(T t, long timeout, TimeUnit unit) { tryAccess(); return delegate.offer(t, timeout, unit); } diff --git a/src/main/java/com/replaymod/render/utils/PixelBufferObject.java b/src/main/java/com/replaymod/render/utils/PixelBufferObject.java index 0a1e0a93..9200fb17 100644 --- a/src/main/java/com/replaymod/render/utils/PixelBufferObject.java +++ b/src/main/java/com/replaymod/render/utils/PixelBufferObject.java @@ -3,26 +3,16 @@ import com.google.common.base.Objects; import com.replaymod.core.ReplayMod; import org.apache.logging.log4j.LogManager; - -//#if MC>=11400 import org.lwjgl.opengl.ARBVertexBufferObject; import org.lwjgl.opengl.GL; -//#else -//$$ import org.lwjgl.opengl.ARBBufferObject; -//$$ import org.lwjgl.opengl.GLContext; -//$$ import org.lwjgl.opengl.Util; -//#endif import java.nio.ByteBuffer; -import static org.lwjgl.opengl.ARBPixelBufferObject.*; +import static org.lwjgl.opengl.ARBPixelBufferObject.GL_PIXEL_PACK_BUFFER_ARB; +import static org.lwjgl.opengl.ARBVertexBufferObject.*; import static org.lwjgl.opengl.GL15.*; import static org.lwjgl.opengl.GL21.GL_PIXEL_PACK_BUFFER; -//#if MC>=11400 -import static org.lwjgl.opengl.ARBVertexBufferObject.*; -//#endif - public class PixelBufferObject { public enum Usage { COPY(GL_STREAM_COPY_ARB, GL_STREAM_COPY), @@ -37,13 +27,8 @@ public enum Usage { } } - //#if MC>=11400 public static final boolean SUPPORTED = GL.getCapabilities().GL_ARB_pixel_buffer_object || GL.getCapabilities().OpenGL15; private static final boolean arb = !GL.getCapabilities().OpenGL15; - //#else - //$$ public static final boolean SUPPORTED = GLContext.getCapabilities().GL_ARB_pixel_buffer_object || GLContext.getCapabilities().OpenGL15; - //$$ private static final boolean arb = !GLContext.getCapabilities().OpenGL15; - //#endif private static ThreadLocal bound = new ThreadLocal<>(); private static ThreadLocal mapped = new ThreadLocal<>(); @@ -57,20 +42,12 @@ public PixelBufferObject(long size, Usage usage) { } this.size = size; - //#if MC>=11400 this.handle = arb ? ARBVertexBufferObject.glGenBuffersARB() : glGenBuffers(); - //#else - //$$ this.handle = arb ? ARBBufferObject.glGenBuffersARB() : glGenBuffers(); - //#endif bind(); if (arb) { - //#if MC>=11400 ARBVertexBufferObject.glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, size, usage.arb); - //#else - //$$ ARBBufferObject.glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, size, usage.arb); - //#endif } else { glBufferData(GL_PIXEL_PACK_BUFFER, size, usage.gl15); } @@ -87,11 +64,7 @@ private int getHandle() { public void bind() { if (arb) { - //#if MC>=11400 ARBVertexBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, getHandle()); - //#else - //$$ ARBBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, getHandle()); - //#endif } else { glBindBuffer(GL_PIXEL_PACK_BUFFER, getHandle()); } @@ -101,11 +74,7 @@ public void bind() { public void unbind() { checkBound(); if (arb) { - //#if MC>=11400 ARBVertexBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); - //#else - //$$ ARBBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); - //#endif } else { glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); } @@ -129,19 +98,10 @@ public ByteBuffer mapReadOnly() { checkNotMapped(); ByteBuffer buffer; if (arb) { - //#if MC>=11400 buffer = ARBVertexBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB, size, null); - //#else - //$$ buffer = ARBBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB, size, null); - //#endif } else { buffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY, size, null); } - //#if MC<11400 - //$$ if (buffer == null) { - //$$ Util.checkGLError(); - //$$ } - //#endif mapped.set(getHandle()); return buffer; } @@ -151,19 +111,10 @@ public ByteBuffer mapWriteOnly() { checkNotMapped(); ByteBuffer buffer; if (arb) { - //#if MC>=11400 buffer = ARBVertexBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_WRITE_ONLY_ARB, size, null); - //#else - //$$ buffer = ARBBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_WRITE_ONLY_ARB, size, null); - //#endif } else { buffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_WRITE_ONLY, size, null); } - //#if MC<11400 - //$$ if (buffer == null) { - //$$ Util.checkGLError(); - //$$ } - //#endif mapped.set(getHandle()); return buffer; } @@ -173,19 +124,10 @@ public ByteBuffer mapReadWrite() { checkNotMapped(); ByteBuffer buffer; if (arb) { - //#if MC>=11400 buffer = ARBVertexBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_WRITE_ARB, size, null); - //#else - //$$ buffer = ARBBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_WRITE_ARB, size, null); - //#endif } else { buffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE, size, null); } - //#if MC<11400 - //$$ if (buffer == null) { - //$$ Util.checkGLError(); - //$$ } - //#endif mapped.set(getHandle()); return buffer; } @@ -196,11 +138,7 @@ public void unmap() { throw new IllegalStateException("Buffer not mapped."); } if (arb) { - //#if MC>=11400 ARBVertexBufferObject.glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); - //#else - //$$ ARBBufferObject.glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); - //#endif } else { glUnmapBuffer(GL_PIXEL_PACK_BUFFER); } @@ -210,11 +148,7 @@ public void unmap() { public void delete() { if (handle != -1) { if (arb) { - //#if MC>=11400 ARBVertexBufferObject.glDeleteBuffersARB(getHandle()); - //#else - //$$ ARBBufferObject.glDeleteBuffersARB(getHandle()); - //#endif } else { glDeleteBuffers(getHandle()); } diff --git a/src/main/java/com/replaymod/render/utils/RenderJob.java b/src/main/java/com/replaymod/render/utils/RenderJob.java index 5203d254..b5f8a7b8 100644 --- a/src/main/java/com/replaymod/render/utils/RenderJob.java +++ b/src/main/java/com/replaymod/render/utils/RenderJob.java @@ -13,11 +13,7 @@ import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.simplepathing.SPTimeline; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; +import java.io.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; @@ -84,7 +80,8 @@ public static List readQueue(ReplayFile replayFile) throws IOExceptio return new GsonBuilder() .registerTypeAdapter(Timeline.class, new TimelineTypeAdapter()) .create() - .fromJson(reader, new TypeToken>(){}.getType()); + .fromJson(reader, new TypeToken>() { + }.getType()); } } } diff --git a/src/main/java/com/replaymod/render/utils/Utils.java b/src/main/java/com/replaymod/render/utils/Utils.java index 8dd5e2a1..7dcfed57 100644 --- a/src/main/java/com/replaymod/render/utils/Utils.java +++ b/src/main/java/com/replaymod/render/utils/Utils.java @@ -7,11 +7,12 @@ public class Utils { /** * Copies the rgb image (flipped vertically) to the specified position in the target buffer - * @param source Source image + * + * @param source Source image * @param xOffset X offset in target image * @param yOffset Y offset in target image - * @param to Target image - * @param width Target image width + * @param to Target image + * @param width Target image width */ public static void openGlBytesToBitmap(OpenGlFrame source, int xOffset, int yOffset, ByteBuffer to, int width) { openGlBytesToBitmap( @@ -21,13 +22,14 @@ public static void openGlBytesToBitmap(OpenGlFrame source, int xOffset, int yOff /** * Copies the rgb image (flipped vertically) to the specified position in the target buffer - * @param buffer Source image - * @param bufferWidth Source image width - * @param bbp Bytes per pixel - * @param xOffset X offset in target image - * @param yOffset Y offset in target image - * @param to Target image - * @param width Target image width + * + * @param buffer Source image + * @param bufferWidth Source image width + * @param bbp Bytes per pixel + * @param xOffset X offset in target image + * @param yOffset Y offset in target image + * @param to Target image + * @param width Target image width */ public static void openGlBytesToBitmap(ByteBuffer buffer, int bufferWidth, int bbp, int xOffset, int yOffset, ByteBuffer to, int width) { byte[] rowBuf = new byte[bufferWidth * bbp]; diff --git a/src/main/java/com/replaymod/replay/FullReplaySender.java b/src/main/java/com/replaymod/replay/FullReplaySender.java index 330c3b3a..63d67c97 100644 --- a/src/main/java/com/replaymod/replay/FullReplaySender.java +++ b/src/main/java/com/replaymod/replay/FullReplaySender.java @@ -5,14 +5,15 @@ import com.google.common.base.Preconditions; import com.google.common.io.Files; import com.replaymod.core.ReplayMod; +import com.replaymod.core.utils.Restrictions; +import com.replaymod.core.utils.WrappedTimer; +import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.gui.versions.callbacks.PreTickCallback; import com.replaymod.mixin.MinecraftAccessor; import com.replaymod.mixin.TimerAccessor; -import com.replaymod.core.utils.Restrictions; import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replaystudio.io.ReplayInputStream; import com.replaymod.replaystudio.replay.ReplayFile; -import com.replaymod.gui.utils.EventRegistrations; -import com.replaymod.gui.versions.callbacks.PreTickCallback; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelDuplexHandler; @@ -21,108 +22,34 @@ import io.netty.channel.ChannelPromise; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.RemoteClientPlayerEntity; -import net.minecraft.client.gui.screen.DownloadTerrainScreen; import net.minecraft.client.gui.screen.AlertScreen; +import net.minecraft.client.gui.screen.DownloadTerrainScreen; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.ProtocolType; import net.minecraft.network.IPacket; import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.server.SChatPacket; -import net.minecraft.network.play.server.SCustomPayloadPlayPacket; -import net.minecraft.network.play.server.SDisconnectPacket; -import net.minecraft.network.play.server.SDestroyEntitiesPacket; -import net.minecraft.network.play.server.SSpawnObjectPacket; -import net.minecraft.network.play.server.SSetExperiencePacket; -import net.minecraft.network.play.server.SSpawnExperienceOrbPacket; -import net.minecraft.network.play.server.SJoinGamePacket; -import net.minecraft.network.play.server.SChangeGameStatePacket; -import net.minecraft.network.play.server.SCloseWindowPacket; -import net.minecraft.network.play.server.SOpenHorseWindowPacket; -import net.minecraft.network.play.server.SSetSlotPacket; -import net.minecraft.network.play.server.SWindowPropertyPacket; -import net.minecraft.network.play.server.SUpdateHealthPacket; +import net.minecraft.network.PacketDirection; +import net.minecraft.network.ProtocolType; import net.minecraft.network.login.server.SLoginSuccessPacket; -import net.minecraft.network.play.server.SSpawnMobPacket; -import net.minecraft.network.play.server.SSpawnPaintingPacket; -import net.minecraft.network.play.server.SSpawnParticlePacket; -import net.minecraft.network.play.server.SPlayerAbilitiesPacket; -import net.minecraft.network.play.server.SPlayerPositionLookPacket; -import net.minecraft.network.play.server.SRespawnPacket; -import net.minecraft.network.play.server.SSpawnPlayerPacket; -import net.minecraft.network.play.server.SOpenSignMenuPacket; -import net.minecraft.network.play.server.SStatisticsPacket; -import net.minecraft.util.text.ITextComponent; +import net.minecraft.network.play.server.*; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; - -//#if MC>=11600 -//#else -//$$ import net.minecraft.network.packet.s2c.play.EntitySpawnGlobalS2CPacket; -//#endif - -//#if MC>=11400 -import net.minecraft.network.play.server.SChunkDataPacket; -import net.minecraft.network.play.server.SPlayerDiggingPacket; -import net.minecraft.network.play.server.SOpenWindowPacket; -import net.minecraft.network.play.server.SOpenBookWindowPacket; -import net.minecraft.entity.EntityType; +import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.GameType; import net.minecraft.world.chunk.AbstractChunkProvider; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.lighting.WorldLightManager; -//#else -//$$ import net.minecraft.client.resources.I18n; -//$$ import net.minecraft.world.EnumDifficulty; -//$$ import net.minecraft.world.World; -//$$ import net.minecraft.world.WorldType; -//$$ import net.minecraft.world.chunk.Chunk; -//$$ import net.minecraft.world.chunk.IChunkProvider; -//$$ import java.util.Iterator; -//#endif - -//#if MC>=11400 -import net.minecraft.util.ResourceLocation; -//#if MC<11400 -//$$ import net.minecraft.world.dimension.DimensionType; -//#endif -//#endif - -//#if MC>=11200 -import com.replaymod.core.utils.WrappedTimer; -import net.minecraft.network.play.server.SAdvancementInfoPacket; -import net.minecraft.network.play.server.SSelectAdvancementsTabPacket; -import net.minecraft.network.play.server.SUpdateRecipesPacket; -//#endif -//#if MC>=11002 -import net.minecraft.world.GameType; -//#else -//$$ import net.minecraft.world.WorldSettings.GameType; -//#endif - -//#if MC>=10904 -import net.minecraft.network.play.server.SUnloadChunkPacket; -//#else -//$$ import net.minecraft.network.play.server.S21PacketChunkData; -//#endif - -//#if MC>=10800 -import net.minecraft.network.play.server.SSendResourcePackPacket; -import net.minecraft.network.play.server.SCameraPacket; -import net.minecraft.network.play.server.STitlePacket; -import net.minecraft.network.PacketDirection; -//#else -//$$ import org.apache.commons.io.Charsets; -//#endif +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; +import java.io.EOFException; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.*; import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.replaystudio.util.Utils.readInt; @@ -138,22 +65,14 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend * These packets are ignored completely during replay. */ private static final List BAD_PACKETS = Arrays.asList( - //#if MC>=11404 SPlayerDiggingPacket.class, - //#endif - //#if MC>=11400 SOpenBookWindowPacket.class, SOpenWindowPacket.class, - //#endif - //#if MC>=11200 SUpdateRecipesPacket.class, SAdvancementInfoPacket.class, SSelectAdvancementsTabPacket.class, - //#endif - //#if MC>=10800 SCameraPacket.class, STitlePacket.class, - //#endif SUpdateHealthPacket.class, SOpenHorseWindowPacket.class, SCloseWindowPacket.class, @@ -174,10 +93,10 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend /** * Whether to work in async mode. - * + *

* When in async mode, a separate thread send packets and waits according to their delays. * This is default in normal playback mode. - * + *

* When in sync mode, no packets will be sent until {@link #sendPacketsTill(int)} is called. * This is used during path playback and video rendering. */ @@ -269,7 +188,8 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend /** * Create a new replay sender. - * @param file The replay file + * + * @param file The replay file * @param asyncMode {@code true} for async mode, {@code false} otherwise * @see #asyncMode */ @@ -290,6 +210,7 @@ public FullReplaySender(ReplayHandler replayHandler, ReplayFile file, boolean as * Set whether this replay sender operates in async mode. * When in async mode, it will send packets timed from a separate thread. * When not in async mode, it will send packets when {@link #sendPacketsTill(int)} is called. + * * @param asyncMode {@code true} to enable async mode */ @Override @@ -328,6 +249,7 @@ public void setSyncModeAndWait() { * Return a fake system tile in milliseconds value that respects slowdown/speedup/pause and works in both, * sync and async mode. * Note: For sync mode this returns the last value passed to {@link #sendPacketsTill(int)}. + * * @return The timestamp in milliseconds since the start of the replay */ @Override @@ -352,13 +274,16 @@ public void terminateReplay() { channelInactive(ctx); ctx.channel().pipeline().close(); FileUtils.deleteDirectory(tempResourcePackFolder); - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private class EventHandler extends EventRegistrations { - { on(PreTickCallback.EVENT, this::onWorldTick); } + { + on(PreTickCallback.EVENT, this::onWorldTick); + } + private void onWorldTick() { // 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 @@ -379,12 +304,12 @@ private void onWorldTick() { public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // When in async mode and the replay sender shut down, then don't send packets - if(terminate && asyncMode) { + if (terminate && asyncMode) { return; } // When a packet is sent directly, perform no filtering - if(msg instanceof IPacket) { + if (msg instanceof IPacket) { super.channelRead(ctx, msg); } @@ -411,46 +336,15 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) if (processed instanceof SSpawnPlayerPacket || processed instanceof SSpawnObjectPacket || processed instanceof SSpawnMobPacket - //#if MC<11600 - //$$ || processed instanceof EntitySpawnGlobalS2CPacket - //#endif || processed instanceof SSpawnPaintingPacket || processed instanceof SSpawnExperienceOrbPacket || processed instanceof SDestroyEntitiesPacket) { ClientWorld world = mc.world; - //#if MC>=11400 // Note: Not sure if it's still required but there's this really handy method anyway world.removeAllEntities(); - //#else - //$$ Iterator iter = world.loadedEntityList.iterator(); - //$$ while (iter.hasNext()) { - //$$ Entity entity = iter.next(); - //$$ if (entity.isDead) { - //$$ int chunkX = entity.chunkCoordX; - //$$ int chunkY = entity.chunkCoordZ; - //$$ - //#if MC>=11400 - //$$ if (entity.addedToChunk && world.getChunkProvider().provideChunk(chunkX, chunkY, false, false) != null) { - //#else - //#if MC>=10904 - //$$ if (entity.addedToChunk && world.getChunkProvider().getLoadedChunk(chunkX, chunkY) != null) { - //#else - //$$ if (entity.addedToChunk && world.getChunkProvider().chunkExists(chunkX, chunkY)) { - //#endif - //#endif - //$$ world.getChunkFromChunkCoords(chunkX, chunkY).removeEntity(entity); - //$$ } - //$$ - //$$ iter.remove(); - //$$ world.onEntityRemoved(entity); - //$$ } - //$$ - //$$ } - //#endif } } - //#if MC>=11400 if (processed instanceof SChunkDataPacket) { Runnable doLightUpdates = () -> { if (mc.world != null) { @@ -466,7 +360,6 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) mc.enqueue(doLightUpdates); } } - //#endif } catch (Exception e) { // We'd rather not have a failure parsing one packet screw up the whole replay process e.printStackTrace(); @@ -483,11 +376,7 @@ private IPacket deserializePacket(byte[] bytes) { int i = pb.readVarInt(); ProtocolType state = loginPhase ? ProtocolType.LOGIN : ProtocolType.PLAY; - //#if MC>=10800 IPacket p = state.getPacket(PacketDirection.CLIENTBOUND, i); - //#else - //$$ Packet p = Packet.generatePacket(state.func_150755_b(), i); - //#endif p.readPacketData(pb); return p; @@ -499,6 +388,7 @@ private IPacket deserializePacket(byte[] bytes) { /** * Process a packet and return the result. + * * @param p The packet to process * @return The processed packet or {@code null} if no packet shall be sent */ @@ -525,14 +415,9 @@ protected IPacket processPacket(IPacket p) throws Exception { e.printStackTrace(); } mc.displayGuiScreen(new AlertScreen( - //#if MC>=11400 () -> mc.displayGuiScreen(null), new TranslationTextComponent("replaymod.error.unknownrestriction1"), new TranslationTextComponent("replaymod.error.unknownrestriction2", unknown) - //#else - //$$ I18n.format("replaymod.error.unknownrestriction1"), - //$$ I18n.format("replaymod.error.unknownrestriction2", unknown) - //#endif )); }); } @@ -548,37 +433,18 @@ protected IPacket processPacket(IPacket p) throws Exception { } } - if(BAD_PACKETS.contains(p.getClass())) return null; + if (BAD_PACKETS.contains(p.getClass())) return null; if (p instanceof SCustomPayloadPlayPacket) { SCustomPayloadPlayPacket packet = (SCustomPayloadPlayPacket) p; - //#if MC>=11400 ResourceLocation channelName = packet.getChannelName(); - //#else - //$$ String channelName = packet.getChannelName(); - //#endif // On 1.14+ there's a dedicated OpenWrittenBookS2CPacket now - //#if MC<11400 - //#if MC>=11400 - //$$ if (SPacketCustomPayload.BOOK_OPEN.equals(channelName)) { - //#else - //$$ if ("MC|BOpen".equals(channelName)) { - //#endif - //$$ return null; - //$$ } - //#endif - //#if MC>=10800 } - if(p instanceof SSendResourcePackPacket) { + if (p instanceof SSendResourcePackPacket) { SSendResourcePackPacket packet = (SSendResourcePackPacket) p; String url = packet.getURL(); if (url.startsWith("replay://")) { - //#else - //$$ String url; - //$$ if ("MC|RPack".equals(channelName) && - //$$ (url = new String(packet.func_149168_d(), Charsets.UTF_8)).startsWith("replay://")) { - //#endif int id = Integer.parseInt(url.substring("replay://".length())); Map index = replayFile.getResourcePackIndex(); if (index != null) { @@ -595,128 +461,50 @@ protected IPacket processPacket(IPacket p) throws Exception { } } - if(p instanceof SJoinGamePacket) { + if (p instanceof SJoinGamePacket) { SJoinGamePacket packet = (SJoinGamePacket) p; int entId = packet.getPlayerId(); allowMovement = true; actualID = entId; entId = -1789435; // Camera entity id should be negative which is an invalid id and can't be used by servers - //#if MC>=11400 p = new SJoinGamePacket( entId, GameType.SPECTATOR, - //#if MC>=11600 GameType.SPECTATOR, - //#endif - //#if MC>=11500 packet.getHashedSeed(), - //#endif false, - //#if MC>=11600 - //#if MC>=11603 packet.getDimensionKeys(), (net.minecraft.util.registry.DynamicRegistries.Impl) packet.getDynamicRegistries(), packet.getSpawnDimension(), - //#else - //$$ packet.method_29443(), - //$$ (net.minecraft.util.registry.RegistryTracker.Modifiable) packet.getDimension(), - //$$ packet.method_29444(), - //#endif packet.getDimension(), - //#else - //$$ packet.getDimension(), - //#endif 0, // max players (has no getter -> never actually used) - //#if MC<11600 - //$$ packet.getGeneratorType(), - //#endif packet.getViewDistance(), packet.isReducedDebugInfo() - //#if MC>=11500 , packet.shouldEnableRespawnScreen() - //#endif - //#if MC>=11600 , packet.func_240820_n_() , packet.isFlatWorld() - //#endif ); - //#else - //#if MC>=10800 - //#if MC>=11400 - //$$ DimensionType dimension = packet.func_212642_e(); - //#else - //$$ int dimension = packet.getDimension(); - //#endif - //$$ EnumDifficulty difficulty = packet.getDifficulty(); - //#if MC>=11400 - //$$ int maxPlayers = 0; // literally never used by vanilla (i.e. no accessor) - //#else - //$$ int maxPlayers = packet.getMaxPlayers(); - //#endif - //$$ WorldType worldType = packet.getWorldType(); - //$$ - //#if MC>=10904 - //$$ p = new SPacketJoinGame(entId, GameType.SPECTATOR, false, dimension, - //$$ difficulty, maxPlayers, worldType, false); - //#else - //$$ p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension, - //$$ difficulty, maxPlayers, worldType, false); - //#endif - //#else - //$$ int dimension = packet.func_149194_f(); - //$$ EnumDifficulty difficulty = packet.func_149192_g(); - //$$ int maxPlayers = packet.func_149193_h(); - //$$ WorldType worldType = packet.func_149196_i(); - //$$ - //$$ p = new S01PacketJoinGame(entId, GameType.ADVENTURE, false, dimension, - //$$ difficulty, maxPlayers, worldType); - //#endif - //#endif } - if(p instanceof SRespawnPacket) { + if (p instanceof SRespawnPacket) { SRespawnPacket respawn = (SRespawnPacket) p; - //#if MC>=11400 p = new SRespawnPacket( - //#if MC>=11600 respawn.func_244303_b(), - //#endif respawn.func_240827_c_(), - //#if MC>=11500 respawn.getHashedSeed(), - //#endif - //#if MC>=11600 GameType.SPECTATOR, GameType.SPECTATOR, respawn.func_240828_f_(), respawn.isFlatWorld(), respawn.shouldSkipErrors() - //#else - //$$ respawn.getGeneratorType(), - //$$ GameMode.SPECTATOR - //#endif ); - //#else - //#if MC>=10809 - //$$ p = new SPacketRespawn(respawn.getDimensionID(), - //$$ respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR); - //#else - //$$ p = new S07PacketRespawn(respawn.func_149082_c(), - //$$ respawn.func_149081_d(), respawn.func_149080_f(), - //#if MC>=10800 - //$$ GameType.SPECTATOR); - //#else - //$$ GameType.ADVENTURE); - //#endif - //#endif - //#endif allowMovement = true; } - if(p instanceof SPlayerPositionLookPacket) { + if (p instanceof SPlayerPositionLookPacket) { final SPlayerPositionLookPacket ppl = (SPlayerPositionLookPacket) p; - if(!hasWorldLoaded) hasWorldLoaded = true; + if (!hasWorldLoaded) hasWorldLoaded = true; ReplayMod.instance.runLater(() -> { if (mc.currentScreen instanceof DownloadTerrainScreen) { @@ -725,33 +513,20 @@ protected IPacket processPacket(IPacket p) throws Exception { } }); - if(replayHandler.shouldSuppressCameraMovements()) return null; + if (replayHandler.shouldSuppressCameraMovements()) return null; CameraEntity cent = replayHandler.getCameraEntity(); - //#if MC>=10800 - //#if MC>=11400 for (SPlayerPositionLookPacket.Flags relative : ppl.getFlags()) { if (relative == SPlayerPositionLookPacket.Flags.X || relative == SPlayerPositionLookPacket.Flags.Y || relative == SPlayerPositionLookPacket.Flags.Z) { - //#else - //#if MC>=10904 - //$$ for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) { - //#else - //$$ for (Object relative : ppl.func_179834_f()) { - //#endif - //$$ if (relative == SPacketPlayerPosLook.EnumFlags.X - //$$ || relative == SPacketPlayerPosLook.EnumFlags.Y - //$$ || relative == SPacketPlayerPosLook.EnumFlags.Z) { - //#endif return null; // At least one of the coordinates is relative, so we don't care } } - //#endif - if(cent != null) { - if(!allowMovement && !((Math.abs(cent.getPosX() - ppl.getX()) > TP_DISTANCE_LIMIT) || + if (cent != null) { + if (!allowMovement && !((Math.abs(cent.getPosX() - ppl.getX()) > TP_DISTANCE_LIMIT) || (Math.abs(cent.getPosZ() - ppl.getZ()) > TP_DISTANCE_LIMIT))) { return null; } else { @@ -774,8 +549,8 @@ public void run() { }.run(); } - if(p instanceof SChangeGameStatePacket) { - SChangeGameStatePacket pg = (SChangeGameStatePacket)p; + if (p instanceof SChangeGameStatePacket) { + SChangeGameStatePacket pg = (SChangeGameStatePacket) p; // only allow the following packets: // 1 - End raining // 2 - Begin raining @@ -784,17 +559,10 @@ public void run() { // 7 - Fade value // 8 - Fade time if (!Arrays.asList( - //#if MC>=11600 SChangeGameStatePacket.RAINING, SChangeGameStatePacket.CLEAR, SChangeGameStatePacket.SET_RAIN_STRENGTH, SChangeGameStatePacket.SET_THUNDER_STRENGTH - //#else - //$$ 1, - //$$ 2, - //$$ 7, - //$$ 8 - //#endif ).contains(pg.getState())) { return null; } @@ -838,17 +606,19 @@ public void flush(ChannelHandlerContext ctx) throws Exception { /** * Returns the speed of the replay. 1 being normal speed, 0.5 half and 2 twice as fast. * If 0 is returned, the replay is paused. + * * @return speed multiplier */ @Override public double getReplaySpeed() { - if(!paused()) return replaySpeed; + if (!paused()) return replaySpeed; else return 0; } /** * Set the speed of the replay. 1 being normal speed, 0.5 half and 2 twice as fast. * The speed may not be set to 0 nor to negative values. + * * @param d Speed multiplier */ @Override @@ -859,11 +629,7 @@ public void setReplaySpeed(final double d) { this.realTimeStart = System.currentTimeMillis() - (long) (lastTimeStamp / d); } TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer(); - //#if MC>=11200 timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK / (float) d); - //#else - //$$ timer.setTimerSpeed((float) d); - //#endif } ///////////////////////////////////////////////////////// @@ -1005,6 +771,7 @@ public void run() { /** * Return whether this replay sender is currently rushing. When rushing, all packets are sent without waiting until * a specified timestamp is passed. + * * @return {@code true} if currently rushing, {@code false} otherwise */ public boolean isHurrying() { @@ -1021,6 +788,7 @@ public void stopHurrying() { /** * Return the timestamp to which this replay sender is currently rushing. All packets with an lower or equal * timestamp will be sent out without any sleeping. + * * @return The timestamp in milliseconds since the start of the replay */ public long getDesiredTimestamp() { @@ -1031,12 +799,13 @@ public long getDesiredTimestamp() { * Jumps to the specified timestamp when in async mode by rushing all packets until one with a timestamp greater * than the specified timestamp is found. * If the timestamp has already passed, this causes the replay to restart and then rush all packets. + * * @param millis Timestamp in milliseconds since the start of the replay */ @Override public void jumpToTime(int millis) { Preconditions.checkState(asyncMode, "Can only jump in async mode. Use sendPacketsTill(int) instead."); - if(millis < lastTimeStamp && !isHurrying()) { + if (millis < lastTimeStamp && !isHurrying()) { startFromBeginning = true; } @@ -1045,19 +814,12 @@ public void jumpToTime(int millis) { protected IPacket processPacketAsync(IPacket p) { //If hurrying, ignore some packets, except for short durations - if(desiredTimeStamp - lastTimeStamp > 1000) { - if(p instanceof SSpawnParticlePacket) return null; + if (desiredTimeStamp - lastTimeStamp > 1000) { + if (p instanceof SSpawnParticlePacket) return null; - if(p instanceof SSpawnObjectPacket) { - SSpawnObjectPacket pso = (SSpawnObjectPacket)p; - //#if MC>=11400 + if (p instanceof SSpawnObjectPacket) { + SSpawnObjectPacket pso = (SSpawnObjectPacket) p; if (pso.getType() == EntityType.FIREWORK_ROCKET) return null; - //#else - //$$ int type = pso.getType(); - //$$ if(type == 76) { // Firework rocket - //$$ return null; - //$$ } - //#endif } } return p; @@ -1070,6 +832,7 @@ protected IPacket processPacketAsync(IPacket p) { /** * Sends all packets until the specified timestamp is reached (inclusive). * If the timestamp is smaller than the last packet sent, the replay is restarted from the beginning. + * * @param timestamp The timestamp in milliseconds since the beginning of this replay */ @Override @@ -1142,17 +905,10 @@ public void sendPacketsTill(int timestamp) { } protected IPacket processPacketSync(IPacket p) { - //#if MC>=10904 if (p instanceof SUnloadChunkPacket) { SUnloadChunkPacket packet = (SUnloadChunkPacket) p; int x = packet.getX(); int z = packet.getZ(); - //#else - //$$ if (p instanceof S21PacketChunkData && ((S21PacketChunkData) p).getExtractedSize() == 0) { - //$$ S21PacketChunkData packet = (S21PacketChunkData) p; - //$$ int x = packet.getChunkX(); - //$$ int z = packet.getChunkZ(); - //#endif // 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 @@ -1163,21 +919,11 @@ protected IPacket processPacketSync(IPacket p) { // 1.14+: The update issue remains but only for non-players and the unloading list bug appears to have been // fixed (chunk unloading no longer removes the entities). // Get the chunk that will be unloaded - //#if MC>=11400 ClientWorld world = mc.world; AbstractChunkProvider chunkProvider = world.getChunkProvider(); Chunk chunk = chunkProvider.getChunkNow(x, z - //#if MC<11500 - //$$ , false - //#endif ); if (chunk != null) { - //#else - //$$ World world = mc.world; - //$$ IChunkProvider chunkProvider = world.getChunkProvider(); - //$$ Chunk chunk = chunkProvider.provideChunk(x, z); - //$$ if (!chunk.isEmpty()) { - //#endif List entitiesInChunk = new ArrayList<>(); // Gather all entities in that chunk for (Collection entityList : chunk.getEntityLists()) { @@ -1189,15 +935,10 @@ protected IPacket processPacketSync(IPacket p) { // Needs to be called at least 4 times thanks to // EntityOtherPlayerMP#otherPlayerMPPosRotationIncrements (max vanilla value is 3) for (int i = 0; i < 4; i++) { - //#if MC>=11400 entity.tick(); - //#else - //$$ entity.onUpdate(); - //#endif } // Check whether the entity has left the chunk - //#if MC>=11404 int chunkX = MathHelper.floor(entity.getPosX() / 16); int chunkY = MathHelper.floor(entity.getPosY() / 16); int chunkZ = MathHelper.floor(entity.getPosZ() / 16); @@ -1207,9 +948,6 @@ protected IPacket processPacketSync(IPacket p) { chunk.removeEntityAtIndex(entity, entity.chunkCoordY); } Chunk newChunk = chunkProvider.getChunkNow(chunkX, chunkZ - //#if MC<11500 - //$$ , false - //#endif ); if (newChunk != null) { newChunk.addEntity(entity); @@ -1218,45 +956,6 @@ protected IPacket processPacketSync(IPacket p) { entity.addedToChunk = false; } } - //#else - //$$ 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); - //#if MC>=10904 - //$$ Chunk newChunk = chunkProvider.getLoadedChunk(chunkX, chunkZ); - //#else - //$$ Chunk newChunk = chunkProvider.chunkExists(chunkX, chunkZ) - //$$ ? chunkProvider.provideChunk(chunkX, chunkZ) : null; - //#endif - //$$ if (newChunk != null) { - //$$ newChunk.addEntity(entity); - //$$ } else { - //$$ // Entity has left all loaded chunks - //$$ entity.addedToChunk = false; - //$$ } - //$$ } else { - //$$ // When entities remain in a chunk that's to be unloaded, they'll only be added to a unload - //$$ // queue and remain loaded as before until the next tick (which during jumping is way off). - //$$ // So, if they are re-spawned with the same entity id, MC actually cleans up the old entity and - //$$ // then adds the new one but leaves the unload queue as is. - //$$ // Finally, on the next tick the legitimate entity will be unloaded because it's part of the - //$$ // unload queue (entities .equals based purely on their id). However, the old entity object - //$$ // is used to determine the chunk the entity is removed from and in this case that'll allow the - //$$ // legitimate entity to remain registered in a loaded chunk, causing them to still be rendered. - //$$ // - //$$ // The usual removal-due-to-chunk-unload process will, without touching the entityList, call - //$$ // onEntityRemoved. In that method WorldClient checks to see whether the entity is still in the - //$$ // entityList (which it is) and then adds it to the entitySpawnQueue. - //$$ // As the final result the entity will remain loaded. - //$$ // To get the same result without ticking, we just remove the entity from the to-be-unloaded - //$$ // chunk but keep it loaded otherwise. They won't be rendered because they're not part of any - //$$ // chunk and will be removed properly if the server decides to re-spawn the entity. - //$$ chunk.removeEntityAtIndex(entity, entity.chunkCoordY); - //$$ entity.addedToChunk = false; - //$$ } - //#endif } } } diff --git a/src/main/java/com/replaymod/replay/InputReplayTimer.java b/src/main/java/com/replaymod/replay/InputReplayTimer.java index 445b2a03..f5d1619d 100644 --- a/src/main/java/com/replaymod/replay/InputReplayTimer.java +++ b/src/main/java/com/replaymod/replay/InputReplayTimer.java @@ -7,31 +7,13 @@ import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; import net.minecraft.util.Timer; - -//#if MC>=11400 import org.lwjgl.glfw.GLFW; -//#else -//$$ import net.minecraft.client.settings.KeyBinding; -//$$ import net.minecraftforge.client.ForgeHooksClient; -//$$ import org.lwjgl.input.Mouse; -//$$ import net.minecraftforge.fml.common.FMLCommonHandler; -//#if MC>=10800 -//$$ import java.io.IOException; -//#else -//$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay; -//$$ import net.minecraft.client.renderer.entity.RenderManager; -//#endif -//#endif -//#if MC>=10904 -//#else -//$$ import net.minecraft.client.multiplayer.WorldClient; -//#endif public class InputReplayTimer extends WrappedTimer { private final ReplayModReplay mod; private final Minecraft mc; - + public InputReplayTimer(Timer wrapped, ReplayModReplay mod) { super(wrapped); this.mod = mod; @@ -39,82 +21,28 @@ public InputReplayTimer(Timer wrapped, ReplayModReplay mod) { } @Override - public - //#if MC>=11600 - int - //#else - //$$ void - //#endif + public int getPartialTicks( - //#if MC>=11400 long sysClock - //#endif ) { - //#if MC>=11600 int ticksThisFrame = - //#endif - super.getPartialTicks( - //#if MC>=11400 - sysClock - //#endif - ); + super.getPartialTicks( + sysClock + ); ReplayMod.instance.runTasks(); - //#if MC<=10710 - //$$ // Code below only updates the current screen when a world and player is loaded. This may not be the case for - //$$ // the GuiOpeningReplay screen resulting in a livelock. - //$$ // To counteract that, we always update that screen (doesn't matter if we do it twice). - //$$ if (mc.currentScreen instanceof GuiOpeningReplay) { - //$$ mc.currentScreen.handleInput(); - //$$ } - //#endif // If we are in a replay, we have to manually process key and mouse events as the // tick speed may vary or there may not be any ticks at all (when the replay is paused) if (mod.getReplayHandler() != null && mc.world != null && mc.player != null) { - //#if MC>=11400 if (mc.currentScreen == null || mc.currentScreen.passEvents) { GLFW.glfwPollEvents(); MCVer.processKeyBinds(); } mc.keyboardListener.tick(); - //#else - //$$ if (mc.currentScreen != null) { - //#if MC>=10800 - //$$ try { - //$$ mc.currentScreen.handleInput(); - //$$ } catch (IOException e) { // *SIGH* - //$$ e.printStackTrace(); - //$$ } - //#else - //$$ mc.currentScreen.handleInput(); - //#endif - //$$ } - //$$ if (mc.currentScreen == null || mc.currentScreen.allowUserInput) { - //#if MC>=10904 - //$$ ((MCVer.MinecraftMethodAccessor) mc).replayModRunTickMouse(); - //$$ ((MCVer.MinecraftMethodAccessor) mc).replayModRunTickKeyboard(); - //#else - //$$ // 1.8.9 and below has one giant tick function, so we try to only do keyboard & mouse as far as possible - //$$ ((MCVer.MinecraftMethodAccessor) mc).replayModSetEarlyReturnFromRunTick(true); - //#if MC>=10800 - //$$ try { - //$$ mc.runTick(); - //$$ } catch (IOException e) { // *SIGH* - //$$ e.printStackTrace(); - //$$ } - //#else - //$$ mc.runTick(); - //#endif - //$$ ((MCVer.MinecraftMethodAccessor) mc).replayModSetEarlyReturnFromRunTick(false); - //#endif - //$$ } - //#endif } - //#if MC>=11600 return ticksThisFrame; - //#endif } public static void handleScroll(int wheel) { diff --git a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java index 0f58e91b..e2c6d727 100644 --- a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java +++ b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java @@ -2,21 +2,13 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; import com.replaymod.core.ReplayMod; import com.replaymod.gui.versions.Image; import net.minecraft.client.Minecraft; -import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.util.ScreenShotHelper; -//#if MC>=11500 -import com.mojang.blaze3d.matrix.MatrixStack; -//#endif - -//#if MC<11400 -//$$ import com.google.common.io.Files; -//$$ import org.apache.commons.io.FileUtils; -//$$ import java.io.File; -//#endif public class NoGuiScreenshot { private final Image image; @@ -61,27 +53,13 @@ public void run() { GlStateManager.pushMatrix(); GlStateManager.clear( 16640 - //#if MC>=11400 , true - //#endif ); mc.getFramebuffer().bindFramebuffer(true); GlStateManager.enableTexture(); float tickDelta = mc.getRenderPartialTicks(); - //#if MC>=11500 mc.gameRenderer.renderWorld(tickDelta, System.nanoTime(), new MatrixStack()); - //#else - //#if MC>=11400 - //$$ mc.gameRenderer.renderWorld(tickDelta, System.nanoTime()); - //#else - //#if MC>=10809 - //$$ mc.entityRenderer.updateCameraAndRender(tickDelta, System.nanoTime()); - //#else - //$$ mc.entityRenderer.updateCameraAndRender(tickDelta); - //#endif - //#endif - //#endif mc.getFramebuffer().unbindFramebuffer(); GlStateManager.popMatrix(); @@ -99,21 +77,7 @@ public void run() { // The frame without GUI has been rendered // Read it, create the screenshot and finish the future try { - //#if MC>=11400 Image image = new Image(ScreenShotHelper.createScreenshot(frameWidth, frameHeight, mc.getFramebuffer())); - //#else - //$$ // We're using Minecraft's ScreenShotHelper even though it writes the screenshot to - //$$ // disk for better maintainability - //$$ File tmpFolder = Files.createTempDir(); - //$$ Image image; - //$$ try { - //$$ ScreenShotHelper.saveScreenshot(tmpFolder, "tmp", frameWidth, frameHeight, mc.getFramebuffer()); - //$$ File screenshotFile = new File(tmpFolder, "screenshots/tmp"); - //$$ image = Image.read(screenshotFile.toPath()); - //$$ } finally { - //$$ FileUtils.deleteQuietly(tmpFolder); - //$$ } - //#endif int imageWidth = image.getWidth(); int imageHeight = image.getHeight(); diff --git a/src/main/java/com/replaymod/replay/QuickReplaySender.java b/src/main/java/com/replaymod/replay/QuickReplaySender.java index 4c42f973..a5c2d8c0 100644 --- a/src/main/java/com/replaymod/replay/QuickReplaySender.java +++ b/src/main/java/com/replaymod/replay/QuickReplaySender.java @@ -1,4 +1,3 @@ -//#if MC>=10904 package com.replaymod.replay; import com.github.steveice10.packetlib.io.NetInput; @@ -7,56 +6,36 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; +import com.replaymod.core.utils.WrappedTimer; +import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.gui.versions.callbacks.PreTickCallback; import com.replaymod.mixin.MinecraftAccessor; import com.replaymod.mixin.TimerAccessor; import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.util.RandomAccessReplay; -import com.replaymod.gui.utils.EventRegistrations; -import com.replaymod.gui.versions.callbacks.PreTickCallback; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerAdapter; import io.netty.channel.ChannelHandlerContext; import net.minecraft.client.Minecraft; -import net.minecraft.network.play.server.SPlayerPositionLookPacket; -import net.minecraft.network.play.server.SRespawnPacket; -import net.minecraft.network.ProtocolType; -import net.minecraft.network.PacketDirection; import net.minecraft.network.IPacket; import net.minecraft.network.PacketBuffer; +import net.minecraft.network.PacketDirection; +import net.minecraft.network.ProtocolType; +import net.minecraft.network.play.server.SPlayerPositionLookPacket; +import net.minecraft.network.play.server.SRespawnPacket; +import net.minecraft.util.registry.DynamicRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.DimensionType; +import net.minecraft.world.GameType; +import net.minecraft.world.World; import javax.annotation.Nullable; import java.io.IOException; import java.util.Collections; import java.util.function.Consumer; -//#if MC>=11602 -import net.minecraft.util.registry.DynamicRegistries; -import net.minecraft.util.registry.Registry; -//#endif - -//#if MC>=11600 -import net.minecraft.world.World; -//#else -//$$ import net.minecraft.world.level.LevelGeneratorType; -//#endif -//#if MC>=11400 -import net.minecraft.world.DimensionType; -//#else -//$$ import net.minecraft.world.EnumDifficulty; -//#endif - -//#if MC>=11200 -import com.replaymod.core.utils.WrappedTimer; -//#endif - -//#if MC>=11002 -import net.minecraft.world.GameType; -//#else -//$$ import net.minecraft.world.WorldSettings.GameType; -//#endif - import static com.replaymod.core.versions.MCVer.getMinecraft; import static com.replaymod.core.versions.MCVer.getPacketTypeRegistry; import static com.replaymod.replay.ReplayModReplay.LOGGER; @@ -99,16 +78,7 @@ public QuickReplaySender(ReplayModReplay mod, ReplayFile replayFile) { @Override protected IPacket decode(com.github.steveice10.netty.buffer.ByteBuf byteBuf) throws IOException { int packetId = new ByteBufNetInput(byteBuf).readVarInt(); - //#if MC>=11500 IPacket mcPacket = ProtocolType.PLAY.getPacket(PacketDirection.CLIENTBOUND, packetId); - //#else - //$$ Packet mcPacket; - //$$ try { - //$$ mcPacket = NetworkState.PLAY.getPacketHandler(NetworkSide.CLIENTBOUND, packetId); - //$$ } catch (IllegalAccessException | InstantiationException e) { - //$$ throw new IOException(e); - //$$ } - //#endif if (mcPacket != null) { int size = byteBuf.readableBytes(); if (buf.length < size) { @@ -173,7 +143,8 @@ public ListenableFuture initialize(Consumer progress) { private void ensureInitialized(Runnable body) { if (initPromise == null) { LOGGER.warn("QuickReplaySender used without prior initialization!", new Throwable()); - initialize(progress -> {}); + initialize(progress -> { + }); } Futures.addCallback(initPromise, new FutureCallback() { @Override @@ -191,12 +162,7 @@ public void onFailure(Throwable t) { public void restart() { replay.reset(); ctx.fireChannelRead(new SRespawnPacket( - //#if MC>=11600 - //#if MC>=11602 DimensionType.registerTypes(new DynamicRegistries.Impl()).getRegistry(Registry.DIMENSION_TYPE_KEY).getValueForKey(DimensionType.OVERWORLD), - //#else - //$$ DimensionType.OVERWORLD_REGISTRY_KEY, - //#endif World.OVERWORLD, 0, GameType.SPECTATOR, @@ -204,21 +170,6 @@ public void restart() { false, false, false - //#else - //#if MC>=11400 - //$$ DimensionType.OVERWORLD, - //#else - //$$ 0, - //#endif - //#if MC>=11500 - //$$ 0, - //#endif - //#if MC<11400 - //$$ EnumDifficulty.NORMAL, - //#endif - //$$ LevelGeneratorType.DEFAULT, - //$$ GameMode.SPECTATOR - //#endif )); ctx.fireChannelRead(new SPlayerPositionLookPacket(0, 0, 0, 0, 0, Collections.emptySet(), 0)); } @@ -237,11 +188,7 @@ public void setReplaySpeed(double factor) { this.replaySpeed = factor; } TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer(); - //#if MC>=11200 timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK / (float) factor); - //#else - //$$ timer.setTimerSpeed((float) factor); - //#endif } @Override @@ -277,7 +224,10 @@ public void jumpToTime(int value) { } private class EventHandler extends EventRegistrations { - { on(PreTickCallback.EVENT, this::onTick); } + { + on(PreTickCallback.EVENT, this::onTick); + } + private void onTick() { if (!asyncMode || paused()) return; @@ -301,4 +251,3 @@ public void sendPacketsTill(int replayTime) { }); } } -//#endif diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index a7a657bf..d163d7ab 100644 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -4,12 +4,22 @@ import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; import com.replaymod.core.ReplayMod; -import com.replaymod.mixin.MinecraftAccessor; -import com.replaymod.mixin.TimerAccessor; import com.replaymod.core.utils.Restrictions; import com.replaymod.core.utils.Utils; import com.replaymod.core.utils.WrappedTimer; +import com.replaymod.gui.container.AbstractGuiScreen; +import com.replaymod.gui.container.GuiContainer; +import com.replaymod.gui.container.GuiScreen; +import com.replaymod.gui.element.GuiLabel; +import com.replaymod.gui.element.advanced.GuiProgressBar; +import com.replaymod.gui.layout.HorizontalLayout; +import com.replaymod.gui.popup.AbstractGuiPopup; +import com.replaymod.mixin.MinecraftAccessor; +import com.replaymod.mixin.Mixin_EntityLivingBaseAccessor; +import com.replaymod.mixin.TimerAccessor; import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.SpectatorCameraController; import com.replaymod.replay.events.ReplayClosedCallback; @@ -19,86 +29,31 @@ import com.replaymod.replaystudio.data.Marker; import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.util.Location; -import com.replaymod.gui.container.AbstractGuiScreen; -import com.replaymod.gui.container.GuiContainer; -import com.replaymod.gui.container.GuiScreen; -import com.replaymod.gui.element.GuiLabel; -import com.replaymod.gui.element.advanced.GuiProgressBar; -import com.replaymod.gui.layout.HorizontalLayout; -import com.replaymod.gui.popup.AbstractGuiPopup; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.embedded.EmbeddedChannel; +import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.DownloadTerrainScreen; import net.minecraft.client.network.login.ClientLoginNetHandler; -import net.minecraft.client.MainWindow; import net.minecraft.crash.CrashReport; import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.NetworkManager; - -import java.io.IOException; -import java.util.*; - -//#if FABRIC<1 -import io.netty.util.AttributeKey; -//#endif - -//#if MC>=11600 -import com.mojang.blaze3d.matrix.MatrixStack; -//#endif - -//#if MC>=11500 -import com.mojang.blaze3d.systems.RenderSystem; -import org.lwjgl.opengl.GL11; -//#endif - -//#if MC>=11400 -import com.replaymod.mixin.Mixin_EntityLivingBaseAccessor; -import net.minecraft.entity.LivingEntity; -//#else -//$$ import com.replaymod.replay.mixin.EntityOtherPlayerMPAccessor; -//$$ import net.minecraft.client.entity.EntityOtherPlayerMP; -//$$ import org.lwjgl.opengl.Display; -//#endif - -//#if MC>=11200 -//#else -//$$ import io.netty.channel.ChannelOutboundHandlerAdapter; -//#endif - -//#if MC<10904 -//$$ import de.johni0702.minecraft.gui.element.GuiLabel; -//$$ import de.johni0702.minecraft.gui.popup.GuiInfoPopup; -//$$ import de.johni0702.minecraft.gui.utils.Colors; -//#endif - -//#if MC>=10800 import net.minecraft.network.PacketDirection; -//#if MC>=11400 import net.minecraftforge.fml.network.NetworkHooks; -//#else -//$$ import com.mojang.authlib.GameProfile; -//$$ import net.minecraft.client.network.NetHandlerPlayClient; -//$$ import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; -//#endif -//#else -//$$ import cpw.mods.fml.client.FMLClientHandler; -//$$ import cpw.mods.fml.common.Loader; -//$$ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -//$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay; -//$$ import net.minecraft.entity.EntityLivingBase; -//$$ -//$$ import java.net.InetSocketAddress; -//$$ import java.net.SocketAddress; -//#endif +import org.lwjgl.opengl.GL11; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.io.IOException; +import java.util.Collections; +import java.util.Set; +import java.util.UUID; -import static com.replaymod.core.versions.MCVer.*; -import static com.replaymod.replay.ReplayModReplay.LOGGER; import static com.mojang.blaze3d.platform.GlStateManager.*; +import static com.replaymod.core.versions.MCVer.getMinecraft; +import static com.replaymod.replay.ReplayModReplay.LOGGER; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; @@ -115,12 +70,8 @@ public class ReplayHandler { * Decodes and sends packets into channel. */ private final FullReplaySender fullReplaySender; - //#if MC>=10904 private final QuickReplaySender quickReplaySender; private boolean quickMode = false; - //#else - //$$ private static final String QUICK_MODE_MIN_MC = "1.9.4"; - //#endif /** * Currently active replay restrictions. @@ -156,9 +107,7 @@ public ReplayHandler(ReplayFile replayFile, boolean asyncMode) throws IOExceptio markers = replayFile.getMarkers().or(Collections.emptySet()); fullReplaySender = new FullReplaySender(this, replayFile, false); - //#if MC>=10904 quickReplaySender = new QuickReplaySender(ReplayModReplay.instance, replayFile); - //#endif setup(); @@ -175,21 +124,10 @@ void restartedReplay() { channel.close(); - //#if MC>=11400 mc.mouseHelper.ungrabMouse(); - //#else - //$$ mc.setIngameNotInFocus(); - //#endif // Force re-creation of camera entity by unloading the previous world - //#if MC>=11400 mc.unloadWorld(); - //#else - //$$ // We need to re-set the GUI screen because having one with `allowsUserInput = true` active during world - //$$ // load (i.e. before player is set) will crash MC... - //$$ mc.displayGuiScreen(new net.minecraft.client.gui.GuiScreen() {}); - //$$ mc.loadWorld(null); - //#endif restrictions = new Restrictions(); @@ -202,11 +140,9 @@ public void endReplay() throws IOException { ReplayClosingCallback.EVENT.invoker().replayClosing(this); fullReplaySender.terminateReplay(); - //#if MC>=10904 if (quickMode) { quickReplaySender.unregister(); } - //#endif replayFile.save(); replayFile.close(); @@ -214,28 +150,15 @@ public void endReplay() throws IOException { channel.close().awaitUninterruptibly(); if (mc.player instanceof CameraEntity) { - //#if MC>=11400 mc.player.remove(); - //#else - //$$ mc.player.setDead(); - //#endif } if (mc.world != null) { - //#if MC>=11400 mc.unloadWorld(); - //#else - //$$ mc.world.sendQuittingDisconnectingPacket(); - //$$ mc.loadWorld(null); - //#endif } TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer(); - //#if MC>=11200 timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK); - //#else - //$$ timer.setTimerSpeed(1); - //#endif overlay.setVisible(false); ReplayModReplay.instance.forcefullyStopReplay(); @@ -248,70 +171,31 @@ public void endReplay() throws IOException { private void setup() { Preconditions.checkState(mc.isOnExecutionThread(), "Must be called from Minecraft thread."); - //#if MC>=11100 mc.ingameGUI.getChatGUI().clearChatMessages(false); - //#else - //$$ mc.ingameGUI.getChatGUI().clearChatMessages(); - //#endif - //#if MC>=10800 NetworkManager networkManager = new NetworkManager(PacketDirection.CLIENTBOUND) { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { t.printStackTrace(); } }; - //#else - //$$ NetworkManager networkManager = new NetworkManager(true) { - //$$ @Override - //$$ public SocketAddress getRemoteAddress() { - //$$ // See https://github.com/Dyonovan/TCNodeTracker/issues/37 - //$$ if (Loader.isModLoaded("tcnodetracker")) { - //$$ StackTraceElement elem = Thread.currentThread().getStackTrace()[2]; - //$$ if ("com.dyonovan.tcnodetracker.events.ClientConnectionEvent".equals(elem.getClassName())) { - //$$ LOGGER.debug("TCNodeTracker crash workaround applied"); - //$$ return new InetSocketAddress("replaymod.dummy", 0); - //$$ } - //$$ } - //$$ return super.getRemoteAddress(); - //$$ } - //$$ - //$$ @Override - //$$ public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) { - //$$ t.printStackTrace(); - //$$ } - //$$ }; - //$$ mc.displayGuiScreen(new GuiOpeningReplay(networkManager)); - //$$ FMLClientHandler.instance().connectToRealmsServer(null, 0); // just to init the playClientBlock latch - //#endif networkManager.setNetHandler(new ClientLoginNetHandler( networkManager, mc, null - //#if MC>=11400 - , it -> {} - //#endif + , it -> { + } )); - //#if MC>=11200 channel = new EmbeddedChannel(); - //#else - //$$ ChannelOutboundHandlerAdapter dummyHandler = new ChannelOutboundHandlerAdapter(); - //$$ channel = new EmbeddedChannel(dummyHandler); - //$$ channel.pipeline().remove(dummyHandler); - //#endif - //#if MC>=10904 channel.pipeline().addLast("ReplayModReplay_quickReplaySender", quickReplaySender); - //#endif channel.pipeline().addLast("ReplayModReplay_replaySender", fullReplaySender); channel.pipeline().addLast("packet_handler", networkManager); channel.pipeline().fireChannelActive(); - //#if FABRIC<1 && MC>=11400 NetworkHooks.registerClientLoginChannel(networkManager); - //#endif } public ReplayFile getReplayFile() { @@ -323,20 +207,16 @@ public Restrictions getRestrictions() { } public ReplaySender getReplaySender() { - //#if MC>=10904 return quickMode ? quickReplaySender : fullReplaySender; - //#else - //$$ return fullReplaySender; - //#endif } public GuiReplayOverlay getOverlay() { return overlay; } - //#if MC>=10904 public void ensureQuickModeInitialized(Runnable andThen) { - if (Utils.ifMinimalModeDoPopup(overlay, () -> {})) return; + if (Utils.ifMinimalModeDoPopup(overlay, () -> { + })) return; ListenableFuture future = quickReplaySender.getInitializationPromise(); if (future == null) { InitializingQuickModePopup popup = new InitializingQuickModePopup(overlay); @@ -424,20 +304,6 @@ public void setQuickMode(boolean quickMode) { public boolean isQuickMode() { return quickMode; } - //#else - //$$ public void ensureQuickModeInitialized(@SuppressWarnings("unused") Runnable andThen) { - //$$ GuiInfoPopup.open(overlay, - //$$ new GuiLabel().setI18nText("replaymod.gui.noquickmode", QUICK_MODE_MIN_MC).setColor(Colors.BLACK)); - //$$ } - //$$ - //$$ public void setQuickMode(@SuppressWarnings("unused") boolean quickMode) { - //$$ throw new UnsupportedOperationException("Quick Mode not supported on this version."); - //$$ } - //$$ - //$$ public boolean isQuickMode() { - //$$ return false; - //$$ } - //#endif public int getReplayDuration() { return replayDuration; @@ -445,6 +311,7 @@ public int getReplayDuration() { /** * Return whether camera movement by user inputs and/or server packets should be suppressed. + * * @return {@code true} if these kinds of movement should be suppressed */ public boolean shouldSuppressCameraMovements() { @@ -453,6 +320,7 @@ public boolean shouldSuppressCameraMovements() { /** * Set whether camera movement by user inputs and/or server packets should be suppressed. + * * @param suppressCameraMovements {@code true} to suppress these kinds of movement, {@code false} to allow them */ public void setSuppressCameraMovements(boolean suppressCameraMovements) { @@ -462,13 +330,10 @@ public void setSuppressCameraMovements(boolean suppressCameraMovements) { /** * Spectate the specified entity. * When the entity is {@code null} or the camera entity, the camera becomes the view entity. + * * @param e The entity to spectate */ - //#if MC>=10800 public void spectateEntity(Entity e) { - //#else - //$$ public void spectateEntity(EntityLivingBase e) { - //#endif CameraEntity cameraEntity = getCameraEntity(); if (cameraEntity == null) { return; // Cannot spectate if we have no camera @@ -502,6 +367,7 @@ public void spectateCamera() { /** * Returns whether the current view entity is the camera entity. + * * @return {@code true} if the camera is the view entity, {@code false} otherwise */ public boolean isCameraView() { @@ -510,6 +376,7 @@ public boolean isCameraView() { /** * Returns the camera entity. + * * @return The camera entity or {@code null} if it does not yet exist */ public CameraEntity getCameraEntity() { @@ -528,7 +395,6 @@ public void moveCameraToTargetPosition() { } public void doJump(int targetTime, boolean retainCameraPosition) { - //#if MC>=10904 if (getReplaySender() == quickReplaySender) { // Always round to full tick targetTime = targetTime + targetTime % 50; @@ -549,15 +415,7 @@ public void doJump(int targetTime, boolean retainCameraPosition) { } // Run previous tick - //#if MC>=11400 mc.runTick(); - //#else - //$$ try { - //$$ mc.runTick(); - //$$ } catch (IOException e) { - //$$ throw new RuntimeException(e); - //$$ } - //#endif // Jump to target tick quickReplaySender.sendPacketsTill(targetTime); @@ -568,7 +426,6 @@ public void doJump(int targetTime, boolean retainCameraPosition) { } return; } - //#endif FullReplaySender replaySender = fullReplaySender; if (replaySender.isHurrying()) { @@ -606,14 +463,11 @@ public void doJump(int targetTime, boolean retainCameraPosition) { // Perform the rendering using OpenGL pushMatrix(); clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT - //#if MC>=11400 , true - //#endif ); enableTexture(); mc.getFramebuffer().bindFramebuffer(true); MainWindow window = mc.getMainWindow(); - //#if MC>=11500 RenderSystem.clear(256, Minecraft.IS_RUNNING_ON_MAC); RenderSystem.matrixMode(GL11.GL_PROJECTION); RenderSystem.loadIdentity(); @@ -621,24 +475,9 @@ public void doJump(int targetTime, boolean retainCameraPosition) { RenderSystem.matrixMode(GL11.GL_MODELVIEW); RenderSystem.loadIdentity(); RenderSystem.translatef(0, 0, -2000); - //#else - //#if MC>=11400 - //$$ window.method_4493(true); - //#else - //$$ mc.entityRenderer.setupOverlayRendering(); - //#endif - //#endif guiScreen.toMinecraft().init(mc, window.getScaledWidth(), window.getScaledHeight()); - //#if MC>=11600 guiScreen.toMinecraft().render(new MatrixStack(), 0, 0, 0); - //#else - //#if MC>=11400 - //$$ guiScreen.toMinecraft().render(0, 0, 0); - //#else - //$$ guiScreen.toMinecraft().drawScreen(0, 0, 0); - //#endif - //#endif guiScreen.toMinecraft().onClose(); mc.getFramebuffer().unbindFramebuffer(); @@ -647,15 +486,7 @@ public void doJump(int targetTime, boolean retainCameraPosition) { mc.getFramebuffer().framebufferRender(mc.getMainWindow().getFramebufferWidth(), mc.getMainWindow().getFramebufferHeight()); popMatrix(); - //#if MC>=11500 mc.getMainWindow().flipFrame(); - //#else - //#if MC>=11400 - //$$ mc.window.setFullscreen(true); - //#else - //$$ Display.update(); - //#endif - //#endif // Send the packets do { @@ -665,18 +496,9 @@ public void doJump(int targetTime, boolean retainCameraPosition) { replaySender.setAsyncMode(true); replaySender.setReplaySpeed(0); - //#if MC<10800 - //$$ while (mc.currentScreen instanceof GuiOpeningReplay) { - //$$ mc.currentScreen.handleInput(); - //$$ } - //#endif mc.getConnection().getNetworkManager() - //#if MC>=11400 .tick(); - //#else - //$$ .processReceivedPackets(); - //#endif for (Entity entity : mc.world.getAllEntities()) { skipTeleportInterpolation(entity); entity.lastTickPosX = entity.prevPosX = entity.getPosX(); @@ -685,15 +507,7 @@ public void doJump(int targetTime, boolean retainCameraPosition) { entity.prevRotationYaw = entity.rotationYaw; entity.prevRotationPitch = entity.rotationPitch; } - //#if MC>=10800 && MC<11400 - //$$ try { - //$$ mc.runTick(); - //$$ } catch (IOException e) { - //$$ e.printStackTrace(); // This should never be thrown but whatever - //$$ } - //#else mc.runTick(); - //#endif //finally, updating the camera's position (which is not done by the sync jumping) moveCameraToTargetPosition(); @@ -705,7 +519,6 @@ public void doJump(int targetTime, boolean retainCameraPosition) { } private void skipTeleportInterpolation(Entity entity) { - //#if MC>=11400 if (entity instanceof LivingEntity && !(entity instanceof CameraEntity)) { LivingEntity e = (LivingEntity) entity; Mixin_EntityLivingBaseAccessor ea = (Mixin_EntityLivingBaseAccessor) e; @@ -713,14 +526,5 @@ private void skipTeleportInterpolation(Entity entity) { e.rotationYaw = (float) ea.getInterpTargetYaw(); e.rotationPitch = (float) ea.getInterpTargetPitch(); } - //#else - //$$ if (entity instanceof EntityOtherPlayerMP) { - //$$ EntityOtherPlayerMP e = (EntityOtherPlayerMP) entity; - //$$ EntityOtherPlayerMPAccessor ea = (EntityOtherPlayerMPAccessor) e; - //$$ e.setPosition(ea.getOtherPlayerMPX(), ea.getOtherPlayerMPY(), ea.getOtherPlayerMPZ()); - //$$ e.rotationYaw = (float) ea.getOtherPlayerMPYaw(); - //$$ e.rotationPitch = (float) ea.getOtherPlayerMPPitch(); - //$$ } - //#endif } } diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index 7e89d1b7..91d30b62 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -7,15 +7,11 @@ import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.Module; import com.replaymod.core.ReplayMod; -import com.replaymod.mixin.MinecraftAccessor; import com.replaymod.core.utils.ModCompat; import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer.Keyboard; -import com.replaymod.replay.camera.CameraController; -import com.replaymod.replay.camera.CameraControllerRegistry; -import com.replaymod.replay.camera.CameraEntity; -import com.replaymod.replay.camera.ClassicCameraController; -import com.replaymod.replay.camera.VanillaCameraController; +import com.replaymod.mixin.MinecraftAccessor; +import com.replaymod.replay.camera.*; import com.replaymod.replay.gui.screen.GuiModCompatWarning; import com.replaymod.replay.handler.GuiHandler; import com.replaymod.replaystudio.data.Marker; @@ -26,7 +22,7 @@ import org.apache.logging.log4j.Logger; import javax.annotation.Nullable; -import java.awt.Graphics; +import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @@ -34,7 +30,10 @@ public class ReplayModReplay implements Module { - { instance = this; } + { + instance = this; + } + public static ReplayModReplay instance; private ReplayMod core; @@ -61,7 +60,7 @@ public void registerKeyBindings(KeyBindingRegistry registry) { registry.registerKeyBinding("replaymod.input.marker", Keyboard.KEY_M, new Runnable() { @Override public void run() { - if (replayHandler != null ) { + if (replayHandler != null) { CameraEntity camera = replayHandler.getCameraEntity(); if (camera != null) { Marker marker = new Marker(); diff --git a/src/main/java/com/replaymod/replay/ReplaySender.java b/src/main/java/com/replaymod/replay/ReplaySender.java index 54afbd7e..0302b99c 100644 --- a/src/main/java/com/replaymod/replay/ReplaySender.java +++ b/src/main/java/com/replaymod/replay/ReplaySender.java @@ -11,25 +11,26 @@ public interface ReplaySender { /** * Whether the replay is currently paused. + * * @return {@code true} if it is paused, {@code false} otherwise */ public default boolean paused() { Minecraft mc = getMinecraft(); TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer(); - //#if MC>=11200 return timer.getTickLength() == Float.POSITIVE_INFINITY; - //#else - //$$ return timer.getTimerSpeed() == 0; - //#endif } void setReplaySpeed(double factor); + double getReplaySpeed(); boolean isAsyncMode(); + void setAsyncMode(boolean async); + void setSyncModeAndWait(); void jumpToTime(int value); // async + void sendPacketsTill(int replayTime); // sync } diff --git a/src/main/java/com/replaymod/replay/Setting.java b/src/main/java/com/replaymod/replay/Setting.java index b2303c61..880a77c2 100644 --- a/src/main/java/com/replaymod/replay/Setting.java +++ b/src/main/java/com/replaymod/replay/Setting.java @@ -15,6 +15,7 @@ public final class Setting extends SettingsRegistry.SettingKeys { public static final SettingsRegistry.MultipleChoiceSettingKeys MAIN_MENU_BUTTON = new SettingsRegistry.MultipleChoiceSettingKeys<>( "replay", "mainMenuButton", null, MainMenuButtonPosition.DEFAULT.name()); + static { MAIN_MENU_BUTTON.setChoices(Arrays.stream(MainMenuButtonPosition.values()).map(Enum::name).collect(Collectors.toList())); } diff --git a/src/main/java/com/replaymod/replay/camera/CameraController.java b/src/main/java/com/replaymod/replay/camera/CameraController.java index c4aa532d..51f74628 100644 --- a/src/main/java/com/replaymod/replay/camera/CameraController.java +++ b/src/main/java/com/replaymod/replay/camera/CameraController.java @@ -4,5 +4,6 @@ public interface CameraController { void update(float partialTicksPassed); void increaseSpeed(); + void decreaseSpeed(); } diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index adabc09b..bb72a811 100644 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -7,85 +7,47 @@ import com.replaymod.core.events.PreRenderCallback; import com.replaymod.core.events.PreRenderHandCallback; import com.replaymod.core.events.SettingsChangedCallback; -import com.replaymod.replay.ReplayHandler; -import com.replaymod.replay.events.RenderHotbarCallback; -import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; +import com.replaymod.core.utils.Utils; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.PreTickCallback; -import com.replaymod.core.utils.Utils; +import com.replaymod.mixin.FirstPersonRendererAccessor; +import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.Setting; -import com.replaymod.mixin.FirstPersonRendererAccessor; +import com.replaymod.replay.events.RenderHotbarCallback; +import com.replaymod.replay.events.RenderSpectatorCrosshairCallback; +import com.replaymod.replay.events.ReplayChatMessageEvent; import com.replaymod.replaystudio.util.Location; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.AbstractClientPlayerEntity; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.network.play.ClientPlayNetHandler; +import net.minecraft.client.util.ClientRecipeBook; +import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerModelPart; +import net.minecraft.fluid.Fluid; +import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.ItemStack; import net.minecraft.stats.StatisticsManager; +import net.minecraft.tags.ITag; +import net.minecraft.util.Hand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.AxisAlignedBB; - -//#if FABRIC>=1 -//#else -import net.minecraftforge.client.event.EntityViewRenderEvent; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.ITextComponent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; -import com.replaymod.replay.events.ReplayChatMessageEvent; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.world.World; -//#endif - -//#if MC>=11400 -import net.minecraft.client.world.ClientWorld; -import net.minecraft.fluid.Fluid; -import net.minecraft.tags.ITag; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.RayTraceResult; -//#else -//$$ import com.replaymod.replay.events.ReplayChatMessageEvent; -//$$ import net.minecraft.util.math.RayTraceResult; -//$$ import net.minecraft.util.text.ITextComponent; -//$$ import net.minecraft.world.World; -//$$ -//#if MC>=11400 -//$$ import net.minecraft.util.math.RayTraceFluidMode; -//#else -//$$ import net.minecraft.block.material.Material; -//$$ import net.minecraft.entity.EntityLivingBase; -//#endif -//#endif - -//#if MC>=10904 -import net.minecraft.inventory.EquipmentSlotType; -//#if MC>=11200 -//#if MC>=11400 -import net.minecraft.client.util.ClientRecipeBook; -//#else -//$$ import net.minecraft.stats.RecipeBook; -//#endif -//#endif -import net.minecraft.util.Hand; -//#endif - -//#if MC>=10800 -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.entity.player.PlayerModelPart; -//#else -//$$ import net.minecraft.client.entity.EntityClientPlayerMP; -//$$ import net.minecraft.util.Session; -//#endif import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.UUID; import java.util.function.Function; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.getMinecraft; /** * The camera entity used as the main player entity during replay viewing. @@ -94,12 +56,7 @@ */ @SuppressWarnings("EntityConstructor") public class CameraEntity - //#if MC>=10800 - extends ClientPlayerEntity - //#else - //$$ extends EntityClientPlayerMP - //#endif -{ + extends ClientPlayerEntity { private static final UUID CAMERA_UUID = UUID.nameUUIDFromBytes("ReplayModCamera".getBytes(StandardCharsets.UTF_8)); /** @@ -125,44 +82,20 @@ public class CameraEntity public CameraEntity( Minecraft mcIn, - //#if MC>=11400 ClientWorld worldIn, - //#else - //$$ World worldIn, - //#endif - //#if MC<10800 - //$$ Session session, - //#endif ClientPlayNetHandler netHandlerPlayClient, StatisticsManager statisticsManager - //#if MC>=11200 - //#if MC>=11400 , ClientRecipeBook recipeBook - //#else - //$$ , RecipeBook recipeBook - //#endif - //#endif ) { super(mcIn, worldIn, - //#if MC<10800 - //$$ session, - //#endif netHandlerPlayClient, statisticsManager - //#if MC>=11200 , recipeBook - //#endif - //#if MC>=11600 , false , false - //#endif ); - //#if MC>=10900 setUniqueId(CAMERA_UUID); - //#else - //$$ entityUniqueID = CAMERA_UUID; - //#endif eventHandler.register(); if (ReplayModReplay.instance.getReplayHandler().getSpectatedUUID() == null) { cameraController = ReplayModReplay.instance.createCameraController(this); @@ -181,6 +114,7 @@ public void setCameraController(CameraController cameraController) { /** * Moves the camera by the specified delta. + * * @param x Delta in X direction * @param y Delta in Y direction * @param z Delta in Z direction @@ -191,6 +125,7 @@ public void moveCamera(double x, double y, double z) { /** * Set the camera position. + * * @param x X coordinate * @param y Y coordinate * @param z Z coordinate @@ -205,9 +140,10 @@ public void setCameraPosition(double x, double y, double z) { /** * Sets the camera rotation. - * @param yaw Yaw in degrees + * + * @param yaw Yaw in degrees * @param pitch Pitch in degrees - * @param roll Roll in degrees + * @param roll Roll in degrees */ public void setCameraRotation(float yaw, float pitch, float roll) { this.prevRotationYaw = this.rotationYaw = yaw; @@ -217,6 +153,7 @@ public void setCameraRotation(float yaw, float pitch, float roll) { /** * Sets the camera position and rotation to that of the specified AdvancedPosition + * * @param pos The position and rotation to set */ public void setCameraPosRot(Location pos) { @@ -226,15 +163,12 @@ public void setCameraPosRot(Location pos) { /** * Sets the camera position and rotation to that of the specified entity. + * * @param to The entity whose position to copy */ public void setCameraPosRot(Entity to) { if (to == this) return; - //#if MC>=10800 float yOffset = 0; - //#else - //$$ float yOffset = 1.62f; // Magic value (eye height) from EntityRenderer#orientCamera - //#endif this.prevPosX = to.prevPosX; this.prevPosY = to.prevPosY + yOffset; this.prevPosZ = to.prevPosZ; @@ -250,27 +184,17 @@ public void setCameraPosRot(Entity to) { } private void updateBoundingBox() { - //#if MC>=11400 float width = getWidth(); float height = getHeight(); - //#endif - //#if MC>=10800 setBoundingBox(new AxisAlignedBB( - //#else - //$$ this.boundingBox.setBB(AxisAlignedBB.getBoundingBox( - //#endif this.getPosX() - width / 2, this.getPosY(), this.getPosZ() - width / 2, this.getPosX() + width / 2, this.getPosY() + height, this.getPosZ() + width / 2)); } @Override public void tick() { - //#if MC>=10800 Entity view = - //#else - //$$ EntityLivingBase view = - //#endif - this.mc.getRenderViewEntity(); + this.mc.getRenderViewEntity(); if (view != null) { // Make sure we're always spectating the right entity // This is important if the spectated player respawns as their @@ -322,36 +246,11 @@ public boolean isEntityInsideOpaqueBlock() { return falseUnlessSpectating(Entity::isEntityInsideOpaqueBlock); // Make sure no suffocation overlay is rendered } - //#if MC<11400 - //$$ @Override - //$$ public boolean isInsideOfMaterial(Material materialIn) { - //$$ return falseUnlessSpectating(e -> e.isInsideOfMaterial(materialIn)); // Make sure no overlays are rendered - //$$ } - //#endif - //#if MC>=11400 @Override public boolean areEyesInFluid(ITag fluid) { return falseUnlessSpectating(entity -> entity.areEyesInFluid(fluid)); } - //#else - //#if MC>=10800 - //$$ @Override - //$$ public boolean isInLava() { - //$$ return falseUnlessSpectating(Entity::isInLava); // Make sure no lava overlay is rendered - //$$ } - //#else - //$$ @Override - //$$ public boolean handleLavaMovement() { - //$$ return falseUnlessSpectating(Entity::handleLavaMovement); // Make sure no lava overlay is rendered - //$$ } - //#endif - //$$ - //$$ @Override - //$$ public boolean isInWater() { - //$$ return falseUnlessSpectating(Entity::isInWater); // Make sure no water overlay is rendered - //$$ } - //#endif @Override public boolean isBurning() { @@ -371,42 +270,27 @@ public boolean canBePushed() { return false; // We are in full control of ourselves } - //#if MC>=10800 @Override protected void handleRunningEffect() { // We do not produce any particles, we are a camera } - //#endif @Override public boolean canBeCollidedWith() { return false; // We are a camera, we cannot collide } - //#if MC>=10800 @Override public boolean isSpectator() { ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); return replayHandler == null || replayHandler.isCameraView(); // Make sure we're treated as spectator } - //#endif - //#if MC>=11400 @Override public boolean isInRangeToRender3d(double double_1, double double_2, double double_3) { return false; // never render the camera otherwise it'd be visible e.g. in 3rd-person or with shaders } - //#else - //$$ @Override - //$$ public boolean shouldRenderInPass(int pass) { - //$$ // Never render the camera - //$$ // This is necessary to hide the player head in third person mode and to not - //$$ // cause any unwanted shadows when rendering with shaders. - //$$ return false; - //$$ } - //#endif - - //#if MC>=10800 + @Override public float getFovModifier() { Entity view = this.mc.getRenderViewEntity(); @@ -415,12 +299,6 @@ public float getFovModifier() { } return 1; } - //#else - //$$ @Override - //$$ public float getFOVMultiplier() { - //$$ return 1; - //$$ } - //#endif @Override public boolean isInvisible() { @@ -431,16 +309,6 @@ public boolean isInvisible() { return super.isInvisible(); } - //#if FABRIC>=1 - //$$ @Override - //$$ public Identifier getSkinTexture() { - //$$ Entity view = this.client.getCameraEntity(); - //$$ if (view != this && view instanceof PlayerEntity) { - //$$ return Utils.getResourceLocationForPlayerUUID(view.getUuid()); - //$$ } - //$$ return super.getSkinTexture(); - //$$ } - //#else @Override public ResourceLocation getLocationSkin() { Entity view = this.mc.getRenderViewEntity(); @@ -449,9 +317,7 @@ public ResourceLocation getLocationSkin() { } return super.getLocationSkin(); } - //#endif - //#if MC>=10800 @Override public String getSkinType() { Entity view = this.mc.getRenderViewEntity(); @@ -469,7 +335,6 @@ public boolean isWearing(PlayerModelPart modelPart) { } return super.isWearing(modelPart); } - //#endif @Override public float getSwingProgress(float renderPartialTicks) { @@ -480,7 +345,6 @@ public float getSwingProgress(float renderPartialTicks) { return 0; } - //#if MC>=10904 @Override public float getCooldownPeriod() { Entity view = this.mc.getRenderViewEntity(); @@ -518,14 +382,11 @@ public boolean isHandActive() { return super.isHandActive(); } - //#if MC>=11400 @Override protected void playEquipSound(ItemStack itemStack_1) { // Suppress equip sounds } - //#endif - //#if MC>=11400 @Override public RayTraceResult pick(double maxDistance, float tickDelta, boolean fluids) { RayTraceResult result = super.pick(maxDistance, tickDelta, fluids); @@ -538,54 +399,7 @@ public RayTraceResult pick(double maxDistance, float tickDelta, boolean fluids) return result; } - //#else - //#if MC>=11400 - //$$ @Override - //$$ public RayTraceResult rayTrace(double blockReachDistance, float partialTicks, RayTraceFluidMode p_174822_4_) { - //$$ RayTraceResult pos = super.rayTrace(blockReachDistance, partialTicks, p_174822_4_); - //$$ - //$$ // Make sure we can never look at blocks (-> no outline) - //$$ if(pos != null && pos.type == RayTraceResult.Type.BLOCK) { - //$$ pos.type = RayTraceResult.Type.MISS; - //$$ } - //$$ - //$$ return pos; - //$$ } - //#else - //$$ @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 == RayTraceResult.Type.BLOCK) { - //$$ pos.typeOfHit = RayTraceResult.Type.MISS; - //$$ } - //$$ - //$$ return pos; - //$$ } - //#endif - //#endif - //#else - //$$ @Override - //$$ public MovingObjectPosition rayTrace(double p_174822_1_, float p_174822_3_) { - //$$ MovingObjectPosition 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; - //$$ } - //$$ - //$$ return pos; - //$$ } - //#endif - - //#if MC<11400 - //$$ @Override - //$$ public void openGui(Object mod, int modGuiId, World world, int x, int y, int z) { - //$$ // Do not open any block GUIs for the camera entities - //$$ // Note: Vanilla GUIs are filtered out on a packet level, this only applies to mod GUIs - //$$ } - //#endif + @Override public void remove() { @@ -621,22 +435,17 @@ private void update() { roll -= Utils.isCtrlDown() ? 0.2 : 1; } - //#if MC>=10800 this.noClip = this.isSpectator(); - //#endif } private void handleInputEvents() { if (this.mc.gameSettings.keyBindAttack.isPressed() || this.mc.gameSettings.keyBindUseItem.isPressed()) { if (this.mc.currentScreen == null && canSpectate(this.mc.pointedEntity)) { ReplayModReplay.instance.getReplayHandler().spectateEntity( - //#if MC<=10710 - //$$ (EntityLivingBase) - //#endif this.mc.pointedEntity); // Make sure we don't exit right away //noinspection StatementWithEmptyBody - while (this.mc.gameSettings.keyBindSneak.isPressed()); + while (this.mc.gameSettings.keyBindSneak.isPressed()) ; } } } @@ -644,68 +453,68 @@ private void handleInputEvents() { private void updateArmYawAndPitch() { this.prevRenderArmYaw = this.renderArmYaw; this.prevRenderArmPitch = this.renderArmPitch; - this.renderArmPitch = this.renderArmPitch + (this.rotationPitch - this.renderArmPitch) * 0.5f; - this.renderArmYaw = this.renderArmYaw + (this.rotationYaw - this.renderArmYaw) * 0.5f; + this.renderArmPitch = this.renderArmPitch + (this.rotationPitch - this.renderArmPitch) * 0.5f; + this.renderArmYaw = this.renderArmYaw + (this.rotationYaw - this.renderArmYaw) * 0.5f; } public boolean canSpectate(Entity e) { return e != null - //#if MC<10800 - //$$ && e instanceof EntityPlayer // cannot be more generic since 1.7.10 has no concept of eye height - //#endif && !e.isInvisible(); } - //#if FABRIC<1 - //#if MC>=11300 @Override public void sendMessage(ITextComponent component, UUID senderUUID) { if (MinecraftForge.EVENT_BUS.post(new ReplayChatMessageEvent(this))) return; super.sendMessage(component, senderUUID); } - //#endif - //#if MC<=11200 - //$$ @Override - //$$ public void sendMessage(ITextComponent message) { - //$$ if (MinecraftForge.EVENT_BUS.post(new ReplayChatMessageEvent(this))) return; - //$$ super.sendMessage(message); - //$$ } - //#endif - //#endif - - //#if MC>=10800 + private - //#else - //$$ public // All event handlers need to be public in 1.7.10 - //#endif class EventHandler extends EventRegistrations { private final Minecraft mc = getMinecraft(); - private EventHandler() {} + private EventHandler() { + } + + { + on(PreTickCallback.EVENT, this::onPreClientTick); + } - { on(PreTickCallback.EVENT, this::onPreClientTick); } private void onPreClientTick() { updateArmYawAndPitch(); } - { on(PreRenderCallback.EVENT, this::onRenderUpdate); } + { + on(PreRenderCallback.EVENT, this::onRenderUpdate); + } + private void onRenderUpdate() { update(); } - { on(KeyBindingEventCallback.EVENT, CameraEntity.this::handleInputEvents); } + { + on(KeyBindingEventCallback.EVENT, CameraEntity.this::handleInputEvents); + } + + { + on(RenderSpectatorCrosshairCallback.EVENT, this::shouldRenderSpectatorCrosshair); + } - { on(RenderSpectatorCrosshairCallback.EVENT, this::shouldRenderSpectatorCrosshair); } private Boolean shouldRenderSpectatorCrosshair() { return canSpectate(mc.pointedEntity); } - { on(RenderHotbarCallback.EVENT, this::shouldRenderHotbar); } + { + on(RenderHotbarCallback.EVENT, this::shouldRenderHotbar); + } + private Boolean shouldRenderHotbar() { return false; } - { on(SettingsChangedCallback.EVENT, this::onSettingsChanged); } + { + on(SettingsChangedCallback.EVENT, this::onSettingsChanged); + } + private void onSettingsChanged(SettingsRegistry registry, SettingsRegistry.SettingKey key) { if (key == Setting.CAMERA) { if (ReplayModReplay.instance.getReplayHandler().getSpectatedUUID() == null) { @@ -716,7 +525,10 @@ private void onSettingsChanged(SettingsRegistry registry, SettingsRegistry.Setti } } - { on(PreRenderHandCallback.EVENT, this::onRenderHand); } + { + on(PreRenderHandCallback.EVENT, this::onRenderHand); + } + private boolean onRenderHand() { // Unless we are spectating another player, don't render our hand Entity view = mc.getRenderViewEntity(); @@ -729,19 +541,12 @@ private boolean onRenderHand() { lastHandRendered = player; FirstPersonRendererAccessor acc = (FirstPersonRendererAccessor) mc.gameRenderer.itemRenderer; - //#if MC>=10904 acc.setPrevEquippedProgressMainHand(1); acc.setPrevEquippedProgressOffHand(1); acc.setEquippedProgressMainHand(1); acc.setEquippedProgressOffHand(1); acc.setItemStackMainHand(player.getItemStackFromSlot(EquipmentSlotType.MAINHAND)); acc.setItemStackOffHand(player.getItemStackFromSlot(EquipmentSlotType.OFFHAND)); - //#else - //$$ acc.setPrevEquippedProgress(1); - //$$ acc.setEquippedProgress(1); - //$$ acc.setItemToRender(player.inventory.getCurrentItem()); - //$$ acc.setEquippedItemSlot(player.inventory.currentItem); - //#endif mc.player.renderArmYaw = mc.player.prevRenderArmYaw = player.rotationYaw; @@ -751,28 +556,10 @@ private boolean onRenderHand() { } } - //#if MC>=11400 // Moved to MixinCamera - //#else - //#if MC>=10800 - //$$ @SubscribeEvent - //$$ public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) { - //$$ if (mc.getRenderViewEntity() == CameraEntity.this) { - //#if MC>=10904 - //$$ event.setRoll(roll); - //#else - //$$ event.roll = roll; - //#endif - //$$ } - //$$ } - //#endif - //#endif private boolean heldItemTooltipsWasTrue; - //#if FABRIC>=1 - //$$ // FIXME fabric - //#else @SubscribeEvent public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) { switch (event.getType()) { @@ -788,19 +575,15 @@ public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) { case EXPERIENCE: case HEALTHMOUNT: case JUMPBAR: - //#if MC>=10904 case POTION_ICONS: - //#endif event.setCanceled(true); break; case HELMET: case PORTAL: case CROSSHAIRS: case BOSSHEALTH: - //#if MC>=10904 case BOSSINFO: case SUBTITLES: - //#endif case TEXT: case CHAT: case PLAYER_LIST: @@ -814,6 +597,5 @@ public void postRenderGameOverlay(RenderGameOverlayEvent.Post event) { if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) return; mc.gameSettings.heldItemTooltips = heldItemTooltipsWasTrue; } - //#endif } } diff --git a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java index a761e338..ef2abd6a 100644 --- a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java @@ -17,7 +17,7 @@ public class ClassicCameraController implements CameraController { private double MAX_SPEED = 10; private double THRESHOLD = MAX_SPEED / 20; - private double DECAY = MAX_SPEED/3; + private double DECAY = MAX_SPEED / 3; private Vector3f direction; private Vector3f dirBefore; @@ -34,34 +34,34 @@ public ClassicCameraController(CameraEntity camera) { public void update(float partialTicksPassed) { boolean forward = false, backward = false, left = false, right = false, up = false, down = false; speedup = false; - for(KeyBinding kb : Minecraft.getInstance().gameSettings.keyBindings) { - if(!kb.isKeyDown()) continue; - if(kb.getKeyDescription().equals("key.forward")) { + for (KeyBinding kb : Minecraft.getInstance().gameSettings.keyBindings) { + if (!kb.isKeyDown()) continue; + if (kb.getKeyDescription().equals("key.forward")) { forward = true; speedup = true; } - if(kb.getKeyDescription().equals("key.back")) { + if (kb.getKeyDescription().equals("key.back")) { backward = true; speedup = true; } - if(kb.getKeyDescription().equals("key.jump")) { + if (kb.getKeyDescription().equals("key.jump")) { up = true; speedup = true; } - if(kb.getKeyDescription().equals("key.left")) { + if (kb.getKeyDescription().equals("key.left")) { left = true; speedup = true; } - if(kb.getKeyDescription().equals("key.right")) { + if (kb.getKeyDescription().equals("key.right")) { right = true; speedup = true; } - if(kb.getKeyDescription().equals("key.sneak")) { + if (kb.getKeyDescription().equals("key.sneak")) { down = true; speedup = true; } @@ -82,28 +82,28 @@ public void decreaseSpeed() { } private void setCameraMaximumSpeed(double maxSpeed) { - if(maxSpeed < LOWER_SPEED || maxSpeed > UPPER_SPEED) return; + if (maxSpeed < LOWER_SPEED || maxSpeed > UPPER_SPEED) return; MAX_SPEED = maxSpeed; THRESHOLD = MAX_SPEED / 20; DECAY = 5; } private void forwardCameraMovement(boolean forward, boolean backward, boolean left, boolean right, boolean up, boolean down) { - if(forward && !backward) { + if (forward && !backward) { setMovement(MoveDirection.FORWARD); - } else if(backward && !forward) { + } else if (backward && !forward) { setMovement(MoveDirection.BACKWARD); } - if(left && !right) { + if (left && !right) { setMovement(MoveDirection.LEFT); - } else if(right && !left) { + } else if (right && !left) { setMovement(MoveDirection.RIGHT); } - if(up && !down) { + if (up && !down) { setMovement(MoveDirection.UP); - } else if(down && !up) { + } else if (down && !up) { setMovement(MoveDirection.DOWN); } } @@ -111,12 +111,12 @@ private void forwardCameraMovement(boolean forward, boolean backward, boolean le private void updateMovement() { long frac = System.currentTimeMillis() - lastCall; - if(frac == 0) return; + if (frac == 0) return; double decFac = Math.max(0, 1 - (DECAY * (frac / 1000D))); - if(speedup) { - if(motion < THRESHOLD) motion = THRESHOLD; + if (speedup) { + if (motion < THRESHOLD) motion = THRESHOLD; motion /= decFac; } else { motion *= decFac; @@ -126,7 +126,7 @@ private void updateMovement() { lastCall = System.currentTimeMillis(); - if(direction == null || direction.lengthSquared() == 0 || motion < THRESHOLD) { + if (direction == null || direction.lengthSquared() == 0 || motion < THRESHOLD) { return; } @@ -138,7 +138,7 @@ private void updateMovement() { private void setMovement(MoveDirection dir) { float rotationPitch = camera.rotationPitch, rotationYaw = camera.rotationYaw; - switch(dir) { + switch (dir) { case BACKWARD: direction = this.getVectorForRotation(-rotationPitch, rotationYaw - 180); break; @@ -161,7 +161,7 @@ private void setMovement(MoveDirection dir) { Vector3f dbf = direction; - if(dirBefore != null) { + if (dirBefore != null) { dirBefore.normalise(dirBefore); Vector3f.add(direction, dirBefore, dirBefore); direction = dirBefore; @@ -174,7 +174,7 @@ private void setMovement(MoveDirection dir) { private Vector3f getVectorForRotation(float pitch, float yaw) { float f2 = cos(-yaw * 0.017453292F - (float) Math.PI); - float f3 = sin(-yaw * 0.017453292F - (float)Math.PI); + float f3 = sin(-yaw * 0.017453292F - (float) Math.PI); float f4 = -cos(-pitch * 0.017453292F); float f5 = sin(-pitch * 0.017453292F); return new Vector3f(f3 * f4, f5, f2 * f4); diff --git a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java index 54a69a48..95802eab 100644 --- a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java @@ -1,24 +1,16 @@ package com.replaymod.replay.camera; -import com.replaymod.replay.ReplayModReplay; import com.replaymod.mixin.EntityPlayerAccessor; +import com.replaymod.replay.ReplayModReplay; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; - -//#if MC>=11400 import net.minecraft.inventory.EquipmentSlotType; -//#endif - -//#if MC>=11400 -//#else -//$$ import org.lwjgl.input.Mouse; -//#endif import java.util.Arrays; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.getMinecraft; public class SpectatorCameraController implements CameraController { private final CameraEntity camera; @@ -39,15 +31,11 @@ public void update(float partialTicksPassed) { mc.gameSettings.keyBindJump, mc.gameSettings.keyBindSneak, mc.gameSettings.keyBindForward, mc.gameSettings.keyBindBack, mc.gameSettings.keyBindLeft, mc.gameSettings.keyBindRight)) { //noinspection StatementWithEmptyBody - while (binding.isPressed()); + while (binding.isPressed()) ; } // Prevent mouse movement - //#if MC>=11400 // No longer needed - //#else - //$$ Mouse.updateCursor(); - //#endif // Always make sure the camera is in the exact same spot as the spectated entity // This is necessary as some rendering code for the hand doesn't respect the view entity @@ -58,23 +46,14 @@ public void update(float partialTicksPassed) { // If it's a player, also 'steal' its inventory so the rendering code knows what item to render if (view instanceof PlayerEntity) { PlayerEntity viewPlayer = (PlayerEntity) view; - //#if MC>=11400 camera.setItemStackToSlot(EquipmentSlotType.HEAD, viewPlayer.getItemStackFromSlot(EquipmentSlotType.HEAD)); camera.setItemStackToSlot(EquipmentSlotType.MAINHAND, viewPlayer.getItemStackFromSlot(EquipmentSlotType.MAINHAND)); camera.setItemStackToSlot(EquipmentSlotType.OFFHAND, viewPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND)); - //#else - //$$ camera.inventory = viewPlayer.inventory; - //#endif EntityPlayerAccessor cameraA = (EntityPlayerAccessor) camera; EntityPlayerAccessor viewPlayerA = (EntityPlayerAccessor) viewPlayer; - //#if MC>=10904 cameraA.setItemStackMainHand(viewPlayerA.getItemStackMainHand()); camera.swingingHand = viewPlayer.swingingHand; cameraA.setActiveItemStackUseCount(viewPlayerA.getActiveItemStackUseCount()); - //#else - //$$ cameraA.setItemInUse(viewPlayerA.getItemInUse()); - //$$ cameraA.setItemInUseCount(viewPlayerA.getItemInUseCount()); - //#endif } } } diff --git a/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java b/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java index dc02fc30..3edd48c8 100644 --- a/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/VanillaCameraController.java @@ -1,8 +1,8 @@ package com.replaymod.replay.camera; import de.johni0702.minecraft.gui.utils.lwjgl.vector.Vector3f; -import net.minecraft.client.Minecraft; import net.minecraft.client.GameSettings; +import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; /** diff --git a/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java b/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java index 8ab036a7..31382c37 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayChatMessageEvent.java @@ -1,4 +1,3 @@ -//#if FABRIC<=0 package com.replaymod.replay.events; import com.replaymod.replay.camera.CameraEntity; @@ -9,7 +8,7 @@ public class ReplayChatMessageEvent extends Event { private final CameraEntity cameraEntity; - public ReplayChatMessageEvent(CameraEntity cameraEntity) { + public ReplayChatMessageEvent(CameraEntity cameraEntity) { this.cameraEntity = cameraEntity; } @@ -17,4 +16,3 @@ public CameraEntity getCameraEntity() { return cameraEntity; } } -//#endif diff --git a/src/main/java/com/replaymod/replay/events/ReplayClosedCallback.java b/src/main/java/com/replaymod/replay/events/ReplayClosedCallback.java index 3b2dd89c..c7adb33b 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayClosedCallback.java +++ b/src/main/java/com/replaymod/replay/events/ReplayClosedCallback.java @@ -1,7 +1,7 @@ package com.replaymod.replay.events; -import com.replaymod.replay.ReplayHandler; import com.replaymod.gui.utils.Event; +import com.replaymod.replay.ReplayHandler; public interface ReplayClosedCallback { Event EVENT = Event.create((listeners) -> diff --git a/src/main/java/com/replaymod/replay/events/ReplayClosingCallback.java b/src/main/java/com/replaymod/replay/events/ReplayClosingCallback.java index 1faeeda4..26b0d07f 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayClosingCallback.java +++ b/src/main/java/com/replaymod/replay/events/ReplayClosingCallback.java @@ -1,7 +1,7 @@ package com.replaymod.replay.events; -import com.replaymod.replay.ReplayHandler; import com.replaymod.gui.utils.Event; +import com.replaymod.replay.ReplayHandler; import java.io.IOException; diff --git a/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java index 05fa3a0e..e69de29b 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java +++ b/src/main/java/com/replaymod/replay/events/ReplayDispatchKeypressesEvent.java @@ -1,12 +0,0 @@ -//#if MC<11400 -//$$ package com.replaymod.replay.events; -//$$ -//$$ import net.minecraftforge.fml.common.eventhandler.Cancelable; -//$$ import net.minecraftforge.fml.common.eventhandler.Event; -//$$ -//$$ public abstract class ReplayDispatchKeypressesEvent extends Event { -//$$ -//$$ @Cancelable -//$$ public static class Pre extends ReplayDispatchKeypressesEvent {} -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/replay/events/ReplayOpenedCallback.java b/src/main/java/com/replaymod/replay/events/ReplayOpenedCallback.java index 8145927f..82a5aa56 100644 --- a/src/main/java/com/replaymod/replay/events/ReplayOpenedCallback.java +++ b/src/main/java/com/replaymod/replay/events/ReplayOpenedCallback.java @@ -1,7 +1,7 @@ package com.replaymod.replay.events; -import com.replaymod.replay.ReplayHandler; import com.replaymod.gui.utils.Event; +import com.replaymod.replay.ReplayHandler; import java.io.IOException; diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiEditMarkerPopup.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiEditMarkerPopup.java index 43dc1d9c..1115137c 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiEditMarkerPopup.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiEditMarkerPopup.java @@ -1,6 +1,7 @@ package com.replaymod.replay.gui.overlay; import com.google.common.base.Strings; +import com.replaymod.core.versions.MCVer.Keyboard; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.element.GuiTextField; @@ -10,7 +11,6 @@ import com.replaymod.gui.layout.VerticalLayout; import com.replaymod.gui.popup.AbstractGuiPopup; import com.replaymod.gui.utils.Colors; -import com.replaymod.core.versions.MCVer.Keyboard; import com.replaymod.replaystudio.data.Marker; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java index 83978de0..1c0e506b 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java @@ -2,16 +2,16 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.versions.MCVer.Keyboard; -import com.replaymod.replay.ReplayHandler; -import com.replaymod.replay.ReplayModReplay; -import com.replaymod.replay.camera.CameraEntity; -import com.replaymod.replaystudio.data.Marker; -import com.replaymod.replaystudio.util.Location; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.element.advanced.AbstractGuiTimeline; import com.replaymod.gui.function.Draggable; import com.replaymod.gui.function.Typeable; +import com.replaymod.replay.ReplayHandler; +import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replay.camera.CameraEntity; +import com.replaymod.replaystudio.data.Marker; +import com.replaymod.replaystudio.util.Location; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; @@ -19,7 +19,6 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; - import java.io.IOException; import java.util.HashSet; import java.util.Set; @@ -116,6 +115,7 @@ protected void drawMarker(GuiRenderer renderer, ReadableDimension size, Marker m /** * Returns the marker which the mouse is at. + * * @param mouseX X coordinate of the mouse * @param mouseY Y coordinate of the mouse * @return The marker or {@code null} if the mouse isn't on a marker diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java index 98371384..90e0396a 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java @@ -4,9 +4,6 @@ import com.replaymod.core.events.KeyBindingEventCallback; import com.replaymod.core.events.KeyEventCallback; import com.replaymod.core.versions.MCVer.Keyboard; -import com.replaymod.replay.ReplayHandler; -import com.replaymod.replay.ReplayModReplay; -import com.replaymod.replay.ReplaySender; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.AbstractGuiOverlay; @@ -19,6 +16,9 @@ import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.replay.ReplayHandler; +import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replay.ReplaySender; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; @@ -63,7 +63,7 @@ public GuiElement getTooltip(RenderInfo renderInfo) { private boolean hidden; public GuiReplayOverlay(final ReplayHandler replayHandler) { - timeline = new GuiMarkerTimeline(replayHandler){ + timeline = new GuiMarkerTimeline(replayHandler) { @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { setCursorPosition(replayHandler.getReplaySender().currentTimeStamp()); @@ -171,7 +171,10 @@ protected GuiReplayOverlay getThis() { } private class EventHandler extends EventRegistrations { - { on(KeyBindingEventCallback.EVENT, this::onKeyBindingEvent); } + { + on(KeyBindingEventCallback.EVENT, this::onKeyBindingEvent); + } + private void onKeyBindingEvent() { GameSettings gameSettings = getMinecraft().gameSettings; while (gameSettings.keyBindChat.isPressed() || gameSettings.keyBindCommand.isPressed()) { @@ -181,7 +184,13 @@ private void onKeyBindingEvent() { } } - { on(KeyEventCallback.EVENT, (int key, int scanCode, int action, int modifiers) -> { onKeyInput(key, action); return false; }); } + { + on(KeyEventCallback.EVENT, (int key, int scanCode, int action, int modifiers) -> { + onKeyInput(key, action); + return false; + }); + } + private void onKeyInput(int key, int action) { if (action != KeyEventCallback.ACTION_PRESS) return; // Allow F1 to be used to hide the replay gui (e.g. for recording with OBS) diff --git a/src/main/java/com/replaymod/replay/gui/screen/GuiModCompatWarning.java b/src/main/java/com/replaymod/replay/gui/screen/GuiModCompatWarning.java index 6761a07c..7f394f77 100644 --- a/src/main/java/com/replaymod/replay/gui/screen/GuiModCompatWarning.java +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiModCompatWarning.java @@ -1,8 +1,6 @@ package com.replaymod.replay.gui.screen; import com.replaymod.core.utils.ModCompat; -import com.replaymod.replaystudio.data.ModInfo; -import com.replaymod.replaystudio.util.I18n; import com.replaymod.gui.container.AbstractGuiScreen; import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.container.GuiVerticalList; @@ -11,6 +9,8 @@ import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.layout.VerticalLayout; +import com.replaymod.replaystudio.data.ModInfo; +import com.replaymod.replaystudio.util.I18n; import java.util.Map; diff --git a/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java b/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java index d12c5a46..e69de29b 100644 --- a/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiOpeningReplay.java @@ -1,19 +0,0 @@ -//#if MC<=10710 -//$$ package com.replaymod.replay.gui.screen; -//$$ -//$$ import net.minecraft.client.gui.GuiScreen; -//$$ import net.minecraft.network.NetworkManager; -//$$ -//$$ public class GuiOpeningReplay extends GuiScreen { -//$$ private final NetworkManager networkManager; -//$$ -//$$ public GuiOpeningReplay(NetworkManager networkManager) { -//$$ this.networkManager = networkManager; -//$$ } -//$$ -//$$ @Override -//$$ public void handleInput() { -//$$ networkManager.processReceivedPackets(); -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java b/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java index f445fb63..87478a33 100644 --- a/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java +++ b/src/main/java/com/replaymod/replay/gui/screen/GuiReplayViewer.java @@ -1,30 +1,19 @@ package com.replaymod.replay.gui.screen; import com.google.common.util.concurrent.SettableFuture; -import com.replaymod.gui.element.GuiTextField; -import com.replaymod.render.gui.GuiRenderQueue; -import com.replaymod.render.rendering.VideoRenderer; -import com.replaymod.render.utils.RenderJob; -import com.replaymod.replaystudio.us.myles.ViaVersion.api.Pair; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.RenderInfo; -import com.replaymod.gui.versions.Image; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.util.text.TextFormatting; import com.replaymod.core.ReplayMod; import com.replaymod.core.SettingsRegistry; import com.replaymod.core.gui.GuiReplaySettings; import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer.Keyboard; -import com.replaymod.replay.ReplayModReplay; -import com.replaymod.replay.Setting; -import com.replaymod.replaystudio.replay.ReplayFile; -import com.replaymod.replaystudio.replay.ReplayMetaData; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.AbstractGuiContainer; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.container.GuiScreen; +import com.replaymod.gui.element.GuiTextField; import com.replaymod.gui.element.advanced.AbstractGuiResourceLoadingList; import com.replaymod.gui.function.Typeable; import com.replaymod.gui.layout.CustomLayout; @@ -34,12 +23,24 @@ import com.replaymod.gui.popup.GuiYesNoPopup; import com.replaymod.gui.utils.Colors; import com.replaymod.gui.utils.Consumer; +import com.replaymod.gui.versions.Image; +import com.replaymod.render.gui.GuiRenderQueue; +import com.replaymod.render.rendering.VideoRenderer; +import com.replaymod.render.utils.RenderJob; +import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replay.Setting; +import com.replaymod.replaystudio.replay.ReplayFile; +import com.replaymod.replaystudio.replay.ReplayMetaData; +import com.replaymod.replaystudio.us.myles.ViaVersion.api.Pair; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.AlertScreen; import net.minecraft.crash.CrashReport; import net.minecraft.crash.ReportedException; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOCase; import org.apache.commons.io.filefilter.SuffixFileFilter; @@ -50,27 +51,12 @@ import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.function.Supplier; import java.util.stream.Collectors; -import static com.replaymod.replay.ReplayModReplay.LOGGER; import static com.replaymod.gui.versions.MCVer.getFontRenderer; - -//#if MC>=11400 -import net.minecraft.util.text.TranslationTextComponent; -//#else -//$$ import net.minecraft.client.resources.I18n; -//#endif +import static com.replaymod.replay.ReplayModReplay.LOGGER; public class GuiReplayViewer extends GuiScreen { private final ReplayModReplay mod; @@ -161,14 +147,9 @@ public void run() { // We failed (might also be their OS) e.printStackTrace(); getMinecraft().displayGuiScreen(new AlertScreen( - //#if MC>=11400 GuiReplayViewer.this::display, new TranslationTextComponent("replaymod.gui.viewer.delete.failed1"), new TranslationTextComponent("replaymod.gui.viewer.delete.failed2") - //#else - //$$ I18n.format("replaymod.gui.viewer.delete.failed1"), - //$$ I18n.format("replaymod.gui.viewer.delete.failed2") - //#endif )); return; } @@ -207,7 +188,11 @@ public void run() { }).setSize(73, 20).setI18nLabel("replaymod.gui.cancel"); public final List replaySpecificButtons = new ArrayList<>(); - { replaySpecificButtons.addAll(Arrays.asList(renameButton)); } + + { + replaySpecificButtons.addAll(Arrays.asList(renameButton)); + } + public final GuiPanel editorButton = new GuiPanel(); public final GuiPanel upperButtonPanel = new GuiPanel().setLayout(new HorizontalLayout().setSpacing(5)) diff --git a/src/main/java/com/replaymod/replay/handler/GuiHandler.java b/src/main/java/com/replaymod/replay/handler/GuiHandler.java index b89b0441..fcc969f9 100644 --- a/src/main/java/com/replaymod/replay/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/replay/handler/GuiHandler.java @@ -2,36 +2,23 @@ import com.replaymod.core.gui.GuiReplayButton; import com.replaymod.gui.container.GuiScreen; -import com.replaymod.replay.Setting; import com.replaymod.gui.container.VanillaGuiScreen; import com.replaymod.gui.element.GuiTooltip; import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.utils.EventRegistrations; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; import com.replaymod.gui.versions.callbacks.InitScreenCallback; import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replay.Setting; import com.replaymod.replay.gui.screen.GuiReplayViewer; +import de.johni0702.minecraft.gui.utils.lwjgl.Point; import net.minecraft.client.gui.screen.IngameMenuScreen; import net.minecraft.client.gui.screen.MainMenuScreen; import net.minecraft.client.gui.screen.MultiplayerScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.Widget; - -//#if MC>=11600 +import net.minecraft.client.gui.widget.button.Button; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; -//#else -//$$ import net.minecraft.client.resource.language.I18n; -//#endif - -//#if FABRIC<1 -import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -//#endif - -//#if MC>=11400 -import net.minecraft.client.gui.widget.button.Button; -//#endif import java.io.IOException; import java.util.ArrayList; @@ -41,7 +28,8 @@ import java.util.function.Consumer; import java.util.stream.Stream; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.addButton; +import static com.replaymod.core.versions.MCVer.findButton; import static com.replaymod.replay.ReplayModReplay.LOGGER; public class GuiHandler extends EventRegistrations { @@ -54,7 +42,10 @@ public GuiHandler(ReplayModReplay mod) { this.mod = mod; } - { on(InitScreenCallback.EVENT, this::injectIntoIngameMenu); } + { + on(InitScreenCallback.EVENT, this::injectIntoIngameMenu); + } + private void injectIntoIngameMenu(Screen guiScreen, List buttonList) { if (!(guiScreen instanceof IngameMenuScreen)) { return; @@ -64,56 +55,22 @@ private void injectIntoIngameMenu(Screen guiScreen, List buttonList) { // Pause replay when menu is opened mod.getReplayHandler().getReplaySender().setReplaySpeed(0); - //#if MC>=11600 final TranslationTextComponent BUTTON_OPTIONS = new TranslationTextComponent("menu.options"); final TranslationTextComponent BUTTON_EXIT_SERVER = new TranslationTextComponent("menu.disconnect"); final TranslationTextComponent BUTTON_ADVANCEMENTS = new TranslationTextComponent("gui.advancements"); final TranslationTextComponent BUTTON_STATS = new TranslationTextComponent("gui.stats"); final TranslationTextComponent BUTTON_OPEN_TO_LAN = new TranslationTextComponent("menu.shareToLan"); - //#else - //#if MC>=11400 - //$$ final String BUTTON_OPTIONS = I18n.translate("menu.options"); - //$$ final String BUTTON_EXIT_SERVER = I18n.translate("menu.disconnect"); - //$$ final String BUTTON_ADVANCEMENTS = I18n.translate("gui.advancements"); - //$$ final String BUTTON_STATS = I18n.translate("gui.stats"); - //$$ final String BUTTON_OPEN_TO_LAN = I18n.translate("menu.shareToLan"); - //#else - //#if MC>=11400 - //$$ final int BUTTON_OPTIONS = 0; - //#endif - //$$ final int BUTTON_EXIT_SERVER = 1; - //$$ final int BUTTON_ADVANCEMENTS = 5; - //$$ final int BUTTON_STATS = 6; - //$$ final int BUTTON_OPEN_TO_LAN = 7; - //#endif - //#endif - - - //#if MC<11400 - //$$ GuiButton openToLan = null; - //#endif - //#if MC>=11400 + + Widget achievements = null, stats = null; - for(Widget b : new ArrayList<>(buttonList)) { - //#else - //$$ GuiButton achievements = null, stats = null; - //$$ for(GuiButton b : new ArrayList<>(buttonList)) { - //#endif + for (Widget b : new ArrayList<>(buttonList)) { boolean remove = false; - //#if MC>=11400 - //#if MC>=11600 ITextComponent id = b.getMessage(); - //#else - //$$ String id = b.getMessage(); - //#endif if (id == null) { // likely a button of some third-part mod // e.g. https://github.com/Pokechu22/WorldDownloader/blob/b1b279f948beec2d7dac7524eea8f584a866d8eb/share_14/src/main/java/wdl/WDLHooks.java#L491 continue; } - //#else - //$$ Integer id = b.id; - //#endif if (id.equals(BUTTON_EXIT_SERVER)) { // Replace "Exit Server" button with "Exit Replay" button remove = true; @@ -136,17 +93,8 @@ private void injectIntoIngameMenu(Screen guiScreen, List buttonList) { stats = b; } else if (id.equals(BUTTON_OPEN_TO_LAN)) { remove = true; - //#if MC<11400 - //$$ openToLan = b; - //#endif - //#if MC>=11400 } else if (id.equals(BUTTON_OPTIONS)) { - //#if MC>=11400 b.setWidth(204); - //#else - //$$ b.width = 200 - //#endif - //#endif } if (remove) { // Moving the button far off-screen is easier to do cross-version than actually removing it @@ -161,32 +109,21 @@ private void injectIntoIngameMenu(Screen guiScreen, List buttonList) { -24); } // In 1.13+ Forge, the Options button shares one row with the Open to LAN button - //#if MC<11400 - //$$ if (openToLan != null) { - //$$ moveAllButtonsInRect(buttonList, - //$$ openToLan.x, openToLan.x + openToLan.width, - //$$ openToLan.y, Integer.MAX_VALUE, - //$$ -24); - //$$ } - //#endif } } /** * Moves all buttons that in any way intersect a rectangle by a given amount on the y axis. + * * @param buttons List of buttons - * @param yStart Top y limit of the rectangle - * @param yEnd Bottom y limit of the rectangle - * @param xStart Left x limit of the rectangle - * @param xEnd Right x limit of the rectangle - * @param moveBy Signed distance to move the buttons + * @param yStart Top y limit of the rectangle + * @param yEnd Bottom y limit of the rectangle + * @param xStart Left x limit of the rectangle + * @param xEnd Right x limit of the rectangle + * @param moveBy Signed distance to move the buttons */ private void moveAllButtonsInRect( - //#if MC>=11400 List buttons, - //#else - //$$ List buttons, - //#endif int xStart, int xEnd, int yStart, @@ -199,7 +136,10 @@ private void moveAllButtonsInRect( .forEach(button -> button.y += moveBy); } - { on(InitScreenCallback.EVENT, this::ensureReplayStopped); } + { + on(InitScreenCallback.EVENT, this::ensureReplayStopped); + } + private void ensureReplayStopped(Screen guiScreen, List buttonList) { if (!(guiScreen instanceof MainMenuScreen || guiScreen instanceof MultiplayerScreen)) { return; @@ -220,7 +160,10 @@ private void ensureReplayStopped(Screen guiScreen, List buttonList) { } } - { on(InitScreenCallback.EVENT, this::injectIntoMainMenu); } + { + on(InitScreenCallback.EVENT, this::injectIntoMainMenu); + } + private void injectIntoMainMenu(Screen guiScreen, List buttonList) { if (!(guiScreen instanceof MainMenuScreen)) { return; @@ -282,13 +225,11 @@ protected void layout(GuiScreen container, int width, int height) { "replaymod.gui.replayviewer", this::onButton ); - //#if FABRIC<=0 if (isCustomMainMenuMod) { // CustomMainMenu uses a different list in the event than in its Fake gui buttonList.add(button); return; } - //#endif addButton(guiScreen, button); } @@ -356,16 +297,9 @@ private Point determineButtonPos(MainMenuButtonPosition buttonPosition, Screen g } } - //#if MC>=11400 private void onButton(InjectedButton button) { Screen guiScreen = button.guiScreen; - //#else - //$$ @SubscribeEvent - //$$ public void onButton(GuiScreenEvent.ActionPerformedEvent.Pre event) { - //$$ GuiScreen guiScreen = event.getGui(); - //$$ GuiButton button = event.getButton(); - //#endif - if(!button.active) return; + if (!button.active) return; if (guiScreen instanceof MainMenuScreen) { if (button.id == BUTTON_REPLAY_VIEWER) { @@ -386,54 +320,27 @@ private void onButton(InjectedButton button) { } public static class InjectedButton extends - //#if MC>=11400 - Button - //#else - //$$ GuiButton - //#endif - { + Button { public final Screen guiScreen; public final int id; private Consumer onClick; + public InjectedButton(Screen guiScreen, int buttonId, int x, int y, int width, int height, String buttonText, - //#if MC>=11400 Consumer onClick - //#else - //$$ Consumer onClick - //#endif ) { super( - //#if MC<11400 - //$$ buttonId, - //#endif x, y, width, height, - //#if MC>=11600 new TranslationTextComponent(buttonText) - //#else - //$$ I18n.translate(buttonText) - //#endif - //#if MC>=11400 , self -> onClick.accept((InjectedButton) self) - //#endif ); this.guiScreen = guiScreen; this.id = buttonId; - //#if MC>=11400 this.onClick = onClick; - //#else - //$$ this.onClick = null; - //#endif } - //#if MC>=11400 && MC<11400 - //$$ @Override - //$$ public void onClick(double mouseX, double mouseY) { - //$$ onClick.accept(this); - //$$ } - //#endif } public enum MainMenuButtonPosition { diff --git a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java index 29256f43..1b82e4f7 100644 --- a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java +++ b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java @@ -5,8 +5,8 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.SettingsRegistry; import com.replaymod.core.events.SettingsChangedCallback; -import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.core.versions.MCVer.Keyboard; +import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.events.ReplayClosedCallback; @@ -37,7 +37,10 @@ import java.util.concurrent.atomic.AtomicInteger; public class ReplayModSimplePathing extends EventRegistrations implements Module { - { instance = this; } + { + instance = this; + } + public static ReplayModSimplePathing instance; private ReplayMod core; @@ -143,7 +146,10 @@ public void registerKeyBindings(KeyBindingRegistry registry) { }); } - { on(ReplayOpenedCallback.EVENT, this::onReplayOpened); } + { + on(ReplayOpenedCallback.EVENT, this::onReplayOpened); + } + private void onReplayOpened(ReplayHandler replayHandler) { ReplayFile replayFile = replayHandler.getReplayFile(); try { @@ -173,7 +179,10 @@ public void run() { }.run(); } - { on(ReplayClosingCallback.EVENT, replayHandler -> onReplayClosing()); } + { + on(ReplayClosingCallback.EVENT, replayHandler -> onReplayClosing()); + } + private void onReplayClosing() { saveService.shutdown(); try { @@ -184,7 +193,10 @@ private void onReplayClosing() { saveService = null; } - { on(ReplayClosedCallback.EVENT, replayHandler -> onReplayClosed()); } + { + on(ReplayClosedCallback.EVENT, replayHandler -> onReplayClosed()); + } + private void onReplayClosed() { currentTimeline = null; guiPathing = null; @@ -255,6 +267,7 @@ public GuiPathing getGuiPathing() { private final AtomicInteger lastSaveId = new AtomicInteger(); private ExecutorService saveService; private Change lastChange; + private void maybeSaveTimeline(ReplayFile replayFile) { SPTimeline spTimeline = currentTimeline; if (spTimeline == null || saveService == null) { diff --git a/src/main/java/com/replaymod/simplepathing/SPTimeline.java b/src/main/java/com/replaymod/simplepathing/SPTimeline.java index 35a854a4..a563d78b 100644 --- a/src/main/java/com/replaymod/simplepathing/SPTimeline.java +++ b/src/main/java/com/replaymod/simplepathing/SPTimeline.java @@ -10,11 +10,7 @@ import com.replaymod.pathing.properties.SpectatorProperty; import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.replaystudio.pathing.PathingRegistry; -import com.replaymod.replaystudio.pathing.change.AddKeyframe; -import com.replaymod.replaystudio.pathing.change.Change; -import com.replaymod.replaystudio.pathing.change.CombinedChange; -import com.replaymod.replaystudio.pathing.change.SetInterpolator; -import com.replaymod.replaystudio.pathing.change.UpdateKeyframeProperties; +import com.replaymod.replaystudio.pathing.change.*; import com.replaymod.replaystudio.pathing.impl.TimelineImpl; import com.replaymod.replaystudio.pathing.interpolation.CatmullRomSplineInterpolator; import com.replaymod.replaystudio.pathing.interpolation.CubicSplineInterpolator; @@ -39,15 +35,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringReader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; import static com.replaymod.replaystudio.pathing.change.RemoveKeyframe.create; import static com.replaymod.simplepathing.ReplayModSimplePathing.LOGGER; @@ -201,7 +189,7 @@ public void addPositionKeyframe(long time, double posX, double posY, double posZ } public Change updatePositionKeyframe(long time, double posX, double posY, double posZ, - float yaw, float pitch, float roll) { + float yaw, float pitch, float roll) { LOGGER.debug("Updating position keyframe at {} to pos {}/{}/{} rot {}/{}/{}", time, posX, posY, posZ, yaw, pitch, roll); @@ -403,7 +391,7 @@ public Change moveKeyframe(SPPath spPath, long oldTime, long newTime) { } else { return SetInterpolator.create(segment, interpolator); } - })).orElseGet(CombinedChange::create); + })).orElseGet(CombinedChange::create); } restoreInterpolatorChange.apply(timeline); @@ -646,6 +634,7 @@ public Interpolator deserializeInterpolator(JsonReader reader) throws IOExceptio /** * Clones an interpolator by de- and re-serializing it. + * * @param interpolator The interpolator to clone * @return The cloned interpolator */ @@ -658,6 +647,7 @@ private Interpolator cloneInterpolator(Interpolator interpolator) { /** * Serializes the specific interpolator to String. * Does not serialize the registered keyframe properties. + * * @param interpolator The interpolator to serialize. * @return The serialized interpolator */ diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java b/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java index 4daec25a..ed38dc8d 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java @@ -1,5 +1,17 @@ package com.replaymod.simplepathing.gui; +import com.replaymod.core.versions.MCVer.Keyboard; +import com.replaymod.gui.container.AbstractGuiContainer; +import com.replaymod.gui.container.GuiPanel; +import com.replaymod.gui.element.*; +import com.replaymod.gui.element.advanced.GuiDropdownMenu; +import com.replaymod.gui.function.Typeable; +import com.replaymod.gui.layout.GridLayout; +import com.replaymod.gui.layout.HorizontalLayout; +import com.replaymod.gui.layout.VerticalLayout; +import com.replaymod.gui.popup.AbstractGuiPopup; +import com.replaymod.gui.utils.Colors; +import com.replaymod.gui.utils.Consumer; import com.replaymod.pathing.properties.CameraProperties; import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.replay.ReplayModReplay; @@ -17,22 +29,6 @@ import com.replaymod.simplepathing.SPTimeline.SPPath; import com.replaymod.simplepathing.Setting; import com.replaymod.simplepathing.properties.ExplicitInterpolationProperty; -import com.replaymod.gui.container.AbstractGuiContainer; -import com.replaymod.gui.container.GuiPanel; -import com.replaymod.gui.element.GuiButton; -import com.replaymod.gui.element.GuiLabel; -import com.replaymod.gui.element.GuiNumberField; -import com.replaymod.gui.element.GuiTooltip; -import com.replaymod.gui.element.IGuiClickable; -import com.replaymod.gui.element.IGuiLabel; -import com.replaymod.gui.element.advanced.GuiDropdownMenu; -import com.replaymod.gui.function.Typeable; -import com.replaymod.gui.layout.GridLayout; -import com.replaymod.gui.layout.HorizontalLayout; -import com.replaymod.gui.layout.VerticalLayout; -import com.replaymod.gui.popup.AbstractGuiPopup; -import com.replaymod.gui.utils.Colors; -import com.replaymod.gui.utils.Consumer; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import net.minecraft.client.resources.I18n; import org.apache.logging.log4j.LogManager; @@ -41,12 +37,6 @@ import java.util.Map; import java.util.Optional; -//#if MC>=11400 -import com.replaymod.core.versions.MCVer.Keyboard; -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif - import static com.replaymod.gui.utils.Utils.link; public abstract class GuiEditKeyframe> extends AbstractGuiPopup implements Typeable { diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java index 2decfc55..1c8a75e5 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java @@ -2,6 +2,9 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.versions.MCVer; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.element.advanced.AbstractGuiTimeline; +import com.replaymod.gui.function.Draggable; import com.replaymod.pathing.properties.CameraProperties; import com.replaymod.pathing.properties.SpectatorProperty; import com.replaymod.pathing.properties.TimestampProperty; @@ -15,16 +18,13 @@ import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.simplepathing.SPTimeline; import com.replaymod.simplepathing.SPTimeline.SPPath; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.element.advanced.AbstractGuiTimeline; -import com.replaymod.gui.function.Draggable; +import de.johni0702.minecraft.gui.utils.lwjgl.Point; +import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; +import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import org.apache.commons.lang3.tuple.Pair; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import org.lwjgl.opengl.GL11; import java.util.Comparator; @@ -247,6 +247,7 @@ private void drawQuadOnSegment(GuiRenderer renderer, int visibleWidth, PathSegme /** * Returns the keyframe at the specified position. + * * @param position The raw position * @return Pair of path id and keyframe or null when no keyframe was clicked */ @@ -376,7 +377,7 @@ public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastC int width = getLastSize().getWidth(); int bodyWidth = width - BORDER_LEFT - BORDER_RIGHT; double segmentLength = getLength() * getZoom(); - double segmentTime = segmentLength * (mouseX - BORDER_LEFT) / bodyWidth; + double segmentTime = segmentLength * (mouseX - BORDER_LEFT) / bodyWidth; int newTime = Math.min(Math.max((int) Math.round(getOffset() + segmentTime), 0), getLength()); if (newTime < 0) { return true; diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java index 79e9be65..8be93d67 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java @@ -7,6 +7,21 @@ import com.google.common.util.concurrent.SettableFuture; import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.RenderInfo; +import com.replaymod.gui.container.GuiContainer; +import com.replaymod.gui.container.GuiPanel; +import com.replaymod.gui.container.GuiScreen; +import com.replaymod.gui.element.*; +import com.replaymod.gui.element.advanced.GuiProgressBar; +import com.replaymod.gui.element.advanced.GuiTimelineTime; +import com.replaymod.gui.layout.CustomLayout; +import com.replaymod.gui.layout.HorizontalLayout; +import com.replaymod.gui.layout.VerticalLayout; +import com.replaymod.gui.popup.AbstractGuiPopup; +import com.replaymod.gui.popup.GuiInfoPopup; +import com.replaymod.gui.popup.GuiYesNoPopup; +import com.replaymod.gui.utils.Colors; import com.replaymod.pathing.gui.GuiKeyframeRepository; import com.replaymod.pathing.player.RealtimeTimelinePlayer; import com.replaymod.pathing.properties.CameraProperties; @@ -26,25 +41,6 @@ import com.replaymod.simplepathing.SPTimeline; import com.replaymod.simplepathing.SPTimeline.SPPath; import com.replaymod.simplepathing.Setting; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.RenderInfo; -import com.replaymod.gui.container.GuiContainer; -import com.replaymod.gui.container.GuiPanel; -import com.replaymod.gui.container.GuiScreen; -import com.replaymod.gui.element.GuiButton; -import com.replaymod.gui.element.GuiElement; -import com.replaymod.gui.element.GuiHorizontalScrollbar; -import com.replaymod.gui.element.GuiLabel; -import com.replaymod.gui.element.GuiTooltip; -import com.replaymod.gui.element.advanced.GuiProgressBar; -import com.replaymod.gui.element.advanced.GuiTimelineTime; -import com.replaymod.gui.layout.CustomLayout; -import com.replaymod.gui.layout.HorizontalLayout; -import com.replaymod.gui.layout.VerticalLayout; -import com.replaymod.gui.popup.AbstractGuiPopup; -import com.replaymod.gui.popup.GuiInfoPopup; -import com.replaymod.gui.popup.GuiYesNoPopup; -import com.replaymod.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; @@ -53,16 +49,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -//#if MC>=11400 -//#else -//$$ import org.lwjgl.input.Keyboard; -//#if MC>=10800 -//$$ import net.minecraftforge.fml.common.Loader; -//#else -//$$ import cpw.mods.fml.common.Loader; -//#endif -//#endif - import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; @@ -71,7 +57,7 @@ import java.util.function.Consumer; import static com.replaymod.core.utils.Utils.error; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.Keyboard; import static com.replaymod.simplepathing.ReplayModSimplePathing.LOGGER; @@ -158,7 +144,7 @@ public GuiElement getTooltip(RenderInfo renderInfo) { } }.setSize(20, 20).setTexture(ReplayMod.TEXTURE, ReplayMod.TEXTURE_SIZE).setTooltip(new GuiTooltip()); - public final GuiKeyframeTimeline timeline = new GuiKeyframeTimeline(this){ + public final GuiKeyframeTimeline timeline = new GuiKeyframeTimeline(this) { @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { if (player.isActive()) { @@ -169,13 +155,16 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render }.setSize(Integer.MAX_VALUE, 20).setMarkers(); public final GuiHorizontalScrollbar scrollbar = new GuiHorizontalScrollbar().setSize(Integer.MAX_VALUE, 9); - {scrollbar.onValueChanged(new Runnable() { - @Override - public void run() { - timeline.setOffset((int) (scrollbar.getPosition() * timeline.getLength())); - timeline.setZoom(scrollbar.getZoom()); - } - }).setZoom(0.1);} + + { + scrollbar.onValueChanged(new Runnable() { + @Override + public void run() { + timeline.setOffset((int) (scrollbar.getPosition() * timeline.getLength())); + timeline.setZoom(scrollbar.getZoom()); + } + }).setZoom(0.1); + } public final GuiTimelineTime timelineTime = new GuiTimelineTime() .setTimeline(timeline); @@ -270,7 +259,7 @@ public void run() { timePath.setActive(!ignoreTimeKeyframes); // Start from cursor time unless the control key is pressed (then start from beginning) - int startTime = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)? 0 : GuiPathing.this.timeline.getCursorPosition(); + int startTime = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) ? 0 : GuiPathing.this.timeline.getCursorPosition(); ListenableFuture future = player.start(timeline, startTime); overlay.setCloseable(false); overlay.setMouseVisible(true); @@ -414,6 +403,7 @@ public void clearKeyframesButtonPressed() { private int prevSpeed = -1; private int prevTime = -1; + private void checkForAutoSync() { if (!mod.keySyncTime.isAutoActivating()) { prevSpeed = -1; @@ -511,7 +501,8 @@ private Timeline preparePathsForPlayback(boolean ignoreTimeKeyframes) { timeline.getPaths().forEach(Path::updateAll); return timeline; } catch (Throwable t) { - error(LOGGER, replayHandler.getOverlay(), CrashReport.makeCrashReport(t, "Cloning timeline"), () -> {}); + error(LOGGER, replayHandler.getOverlay(), CrashReport.makeCrashReport(t, "Cloning timeline"), () -> { + }); return null; } } @@ -597,7 +588,8 @@ public void onFailure(@Nonnull Throwable t) { /** * Called when either one of the property buttons is pressed. - * @param path {@code TIME} for the time property button, {@code POSITION} for the place property button + * + * @param path {@code TIME} for the time property button, {@code POSITION} for the place property button * @param neverSpectator when true, will insert a position keyframe even when currently spectating an entity */ public void toggleKeyframe(SPPath path, boolean neverSpectator) { diff --git a/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java b/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java index f9511f1d..446f8105 100644 --- a/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java +++ b/src/main/java/com/replaymod/simplepathing/preview/PathPreview.java @@ -3,8 +3,8 @@ import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.SettingsRegistry; import com.replaymod.core.events.SettingsChangedCallback; -import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.core.versions.MCVer.Keyboard; +import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.events.ReplayClosedCallback; import com.replaymod.replay.events.ReplayOpenedCallback; diff --git a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java index 7fea342e..5d7fc47c 100644 --- a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java +++ b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java @@ -1,9 +1,12 @@ package com.replaymod.simplepathing.preview; +import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import com.replaymod.core.ReplayMod; import com.replaymod.core.events.PostRenderWorldCallback; import com.replaymod.core.versions.MCVer; +import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.pathing.properties.CameraProperties; import com.replaymod.pathing.properties.SpectatorProperty; import com.replaymod.pathing.properties.TimestampProperty; @@ -17,22 +20,16 @@ import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.simplepathing.SPTimeline; import com.replaymod.simplepathing.gui.GuiPathing; -import com.replaymod.gui.utils.EventRegistrations; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; import org.lwjgl.opengl.GL11; -//#if MC>=11500 -import com.mojang.blaze3d.systems.RenderSystem; -//#endif - import java.util.Comparator; import java.util.Optional; @@ -54,7 +51,10 @@ public PathPreviewRenderer(ReplayModSimplePathing mod, ReplayHandler replayHandl this.replayHandler = replayHandler; } - { on(PostRenderWorldCallback.EVENT, this::renderCameraPath); } + { + on(PostRenderWorldCallback.EVENT, this::renderCameraPath); + } + private void renderCameraPath(MatrixStack matrixStack) { if (!replayHandler.getReplaySender().isAsyncMode() || mc.gameSettings.hideGUI) return; @@ -79,12 +79,7 @@ private void renderCameraPath(MatrixStack matrixStack) { Triple viewPos = Triple.of( view.getPosX(), view.getPosY() - //#if MC>=10800 && MC<11500 - //$$ // Eye height is subtracted to make path appear higher (at eye height) than it actually is (at foot height) - //$$ - view.getStandingEyeHeight(), - //#else , - //#endif view.getPosZ() ); @@ -94,9 +89,7 @@ private void renderCameraPath(MatrixStack matrixStack) { GL11.glDisable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_TEXTURE_2D); - //#if MC>=11500 RenderSystem.multMatrix(matrixStack.getLast().getMatrix()); - //#endif for (PathSegment segment : path.getSegments()) { Interpolator interpolator = segment.getInterpolator(); @@ -326,44 +319,44 @@ private void drawCamera(Triple view, float cubeSize = 0.5f; - double r = -cubeSize/2; + double r = -cubeSize / 2; buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR); //back buffer.pos(r, r + cubeSize, r).tex(3 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r + cubeSize, r + cubeSize, r).tex(4*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r + cubeSize, r, r).tex(4*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r, r, r).tex(3*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r).tex(4 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r, r).tex(4 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r).tex(3 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); //front - buffer.pos(r + cubeSize, r, r + cubeSize).tex(2 * 8 / 64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2 * 8 / 64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r, r + cubeSize).tex(2 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); buffer.pos(r, r + cubeSize, r + cubeSize).tex(8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r, r, r + cubeSize).tex(8 / 64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r + cubeSize).tex(8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); //left - buffer.pos(r + cubeSize, r + cubeSize, r).tex(0, 8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r + cubeSize, r, r + cubeSize).tex(8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r+cubeSize, r, r).tex(0, 2*8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r).tex(0, 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r, r + cubeSize).tex(8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r, r).tex(0, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); //right - buffer.pos(r, r + cubeSize, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r, r + cubeSize, r).tex(3*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r, r, r).tex(3*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r + cubeSize, r + cubeSize).tex(2 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r + cubeSize, r).tex(3 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r).tex(3 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); buffer.pos(r, r, r + cubeSize).tex(2 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); //bottom - buffer.pos(r + cubeSize, r, r).tex(3*8/64f, 0).color(255, 255, 255, 200).endVertex(); - buffer.pos(r + cubeSize, r, r + cubeSize).tex(3*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r, r, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r, r).tex(3 * 8 / 64f, 0).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r, r + cubeSize).tex(3 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r, r + cubeSize).tex(2 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); buffer.pos(r, r, r).tex(2 * 8 / 64f, 0).color(255, 255, 255, 200).endVertex(); //top - buffer.pos(r, r + cubeSize, r).tex(8/64f, 0).color(255, 255, 255, 200).endVertex(); - buffer.pos(r, r + cubeSize, r + cubeSize).tex(8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); - buffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r + cubeSize, r).tex(8 / 64f, 0).color(255, 255, 255, 200).endVertex(); + buffer.pos(r, r + cubeSize, r + cubeSize).tex(8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + buffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); buffer.pos(r + cubeSize, r + cubeSize, r).tex(2 * 8 / 64f, 0).color(255, 255, 255, 200).endVertex(); tessellator.draw(); diff --git a/src/main/java/com/replaymod/simplepathing/properties/ExplicitInterpolationProperty.java b/src/main/java/com/replaymod/simplepathing/properties/ExplicitInterpolationProperty.java index 5f374ace..c8430b45 100644 --- a/src/main/java/com/replaymod/simplepathing/properties/ExplicitInterpolationProperty.java +++ b/src/main/java/com/replaymod/simplepathing/properties/ExplicitInterpolationProperty.java @@ -2,9 +2,9 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; +import com.replaymod.gui.utils.NonNull; import com.replaymod.replaystudio.pathing.property.AbstractProperty; import com.replaymod.replaystudio.pathing.property.PropertyPart; -import com.replaymod.gui.utils.NonNull; import org.apache.commons.lang3.ObjectUtils; import java.io.IOException; diff --git a/src/main/resources/assets/replaymod/shader/ods.frag b/src/main/resources/assets/replaymod/shader/ods.frag index f17f8f8d..eb359cd5 100644 --- a/src/main/resources/assets/replaymod/shader/ods.frag +++ b/src/main/resources/assets/replaymod/shader/ods.frag @@ -4,15 +4,11 @@ varying vec4 vertColor; varying vec4 textureCoord; varying vec4 lightMapCoord; -//#if MC>=11500 varying vec4 overlayCoords; -//#endif uniform sampler2D texture; uniform sampler2D lightMap; -//#if MC>=11500 uniform sampler2D overlay; -//#endif uniform bool textureEnabled; uniform bool lightMapEnabled; @@ -25,13 +21,9 @@ void main() { color *= texture2D(texture, textureCoord.st); } if (overlayEnabled) { - //#if MC>=11500 - vec4 c = texture2D(overlay, overlayCoords.st); + vec4 c = texture2D(overlay, overlayCoords.st); color = vec4(mix(c.rgb, color.rgb, c.a), color.a); - //#else - //$$ color = vec4(mix(color.rgb, vec3(1, 0, 0), 0.3), color.a); - //#endif - } + } if (lightMapEnabled) { color *= texture2D(lightMap, lightMapCoord.st); } @@ -39,4 +31,4 @@ void main() { color.rgb = mix(color.rgb, gl_Fog.color.rgb, clamp((gl_FogFragCoord - gl_Fog.start) * gl_Fog.scale, 0.0, 1.0)); } gl_FragColor = color; -} \ No newline at end of file +} diff --git a/src/main/resources/assets/replaymod/shader/ods.vert b/src/main/resources/assets/replaymod/shader/ods.vert index 43160450..14ca3a2e 100644 --- a/src/main/resources/assets/replaymod/shader/ods.vert +++ b/src/main/resources/assets/replaymod/shader/ods.vert @@ -5,9 +5,7 @@ varying float vertId; varying vec4 textureCoord; varying vec4 lightMapCoord; -//#if MC>=11500 varying vec4 overlayCoords; -//#endif uniform bool leftEye; uniform int direction; @@ -69,12 +67,8 @@ void main() { // Misc. textureCoord = gl_TextureMatrix[0] * gl_MultiTexCoord0; - //#if MC>=11500 - overlayCoords = gl_TextureMatrix[1] * gl_MultiTexCoord1; + overlayCoords = gl_TextureMatrix[1] * gl_MultiTexCoord1; lightMapCoord = gl_TextureMatrix[2] * gl_MultiTexCoord2; - //#else - //$$ lightMapCoord = gl_TextureMatrix[1] * gl_MultiTexCoord1; - //#endif - vertColor = gl_Color; + vertColor = gl_Color; gl_FogFragCoord = sqrt(position.x * position.x + position.y * position.y + position.z * position.z); -} \ No newline at end of file +} diff --git a/src/main/resources/mixins.compat.mapwriter.replaymod.json b/src/main/resources/mixins.compat.mapwriter.replaymod.json index ac038ec8..3e8c82db 100644 --- a/src/main/resources/mixins.compat.mapwriter.replaymod.json +++ b/src/main/resources/mixins.compat.mapwriter.replaymod.json @@ -4,11 +4,8 @@ "mixins": [], "server": [], "client": [ - //#if MC<11400 - //$$ "MixinMinecraft" - //#endif - ], + ], "compatibilityLevel": "JAVA_8", "minVersion": "0.6.11", "refmap": "mixins.replaymod.refmap.json" -} \ No newline at end of file +} diff --git a/src/main/resources/mixins.compat.shaders.replaymod.json b/src/main/resources/mixins.compat.shaders.replaymod.json index 163e36b0..bb80dac1 100644 --- a/src/main/resources/mixins.compat.shaders.replaymod.json +++ b/src/main/resources/mixins.compat.shaders.replaymod.json @@ -4,18 +4,12 @@ "mixins": [], "server": [], "client": [ - //#if MC>=11500 - "MixinChunkVisibility", - //#endif - //#if MC>=10800 - "MixinShaderEntityRenderer", + "MixinChunkVisibility", + "MixinShaderEntityRenderer", "MixinShaderRenderChunk", - //#else - //$$ "MixinShaders", - //#endif - "MixinShadersRender" + "MixinShadersRender" ], "compatibilityLevel": "JAVA_8", "minVersion": "0.6.11", "refmap": "mixins.replaymod.refmap.json" -} \ No newline at end of file +} diff --git a/src/main/resources/mixins.core.replaymod.json b/src/main/resources/mixins.core.replaymod.json index 63b2d884..8633d258 100644 --- a/src/main/resources/mixins.core.replaymod.json +++ b/src/main/resources/mixins.core.replaymod.json @@ -5,21 +5,10 @@ "server": [], "client": [ "Mixin_ContextualKeyBindings", - //#if MC>=11400 - "AbstractButtonWidgetAccessor", + "AbstractButtonWidgetAccessor", "MixinGameRenderer", - //#if FABRIC>=1 - //$$ "Mixin_HideDynamicResourcePacks", - //$$ "Mixin_RegisterDynamicResourcePacks", - //#endif - //#endif - //#if MC>=11400 - "MixinMouse", - //#endif - //#if MC<10800 - //$$ "ResourcePackRepositoryAccessor", - //#endif - "MixinKeyboardListener", + "MixinMouse", + "MixinKeyboardListener", "MixinMinecraft", "GuiMainMenuAccessor", "GuiScreenAccessor", diff --git a/src/main/resources/mixins.jgui.json b/src/main/resources/mixins.jgui.json index af54d9e0..b5d5a881 100644 --- a/src/main/resources/mixins.jgui.json +++ b/src/main/resources/mixins.jgui.json @@ -4,18 +4,7 @@ "mixins": [], "server": [], "client": [ - //#if FABRIC>=1 - //#if MC>=11400 - //$$ "com.replaymod.gui.versions.mixin.Mixin_RenderHudCallback", - //$$ "com.replaymod.gui.versions.mixin.MixinGameRenderer", - //$$ "com.replaymod.gui.versions.mixin.MixinScreen", - //$$ "com.replaymod.gui.versions.mixin.MixinMouseListener", - //$$ "com.replaymod.gui.versions.mixin.MixinKeyboardListener", - //$$ // Note: MixinMinecraft actually belongs one line down in the 1.13 part but see its source file for why it isn't - //$$ "com.replaymod.gui.versions.mixin.MixinMinecraft" - //#endif - //#endif - ], + ], "compatibilityLevel": "JAVA_8", "minVersion": "0.6.11", "refmap": "mixins.jgui.refmap.json" diff --git a/src/main/resources/mixins.recording.replaymod.json b/src/main/resources/mixins.recording.replaymod.json index e6c9ee41..403a2ba3 100644 --- a/src/main/resources/mixins.recording.replaymod.json +++ b/src/main/resources/mixins.recording.replaymod.json @@ -11,28 +11,14 @@ "SPacketSpawnMobAccessor", "SPacketSpawnPlayerAccessor", "MixinServerInfo", - //#if MC>=11400 - "MixinDownloadingPackFinder", + "MixinDownloadingPackFinder", "MixinMouseHelper", - //#endif - //#if MC>=10904 - //#if MC<11400 - //$$ "MixinPlayerControllerMP", - //#endif - "MixinWorldClient", - //#endif - //#if MC<=10710 - //$$ "MixinGuiScreen", - //$$ "MixinS26PacketMapChunkBulk", - //#endif - "MixinNetHandlerLoginClient", + "MixinWorldClient", + "MixinNetHandlerLoginClient", "MixinNetHandlerPlayClient", - //#if MC<11400 - //$$ "MixinNetworkDispatcher", - //#endif - "MixinRenderGlobal" + "MixinRenderGlobal" ], "compatibilityLevel": "JAVA_8", "minVersion": "0.6.11", "refmap": "mixins.replaymod.refmap.json" -} \ No newline at end of file +} diff --git a/src/main/resources/mixins.render.blend.replaymod.json b/src/main/resources/mixins.render.blend.replaymod.json index 7812f039..42db5b16 100644 --- a/src/main/resources/mixins.render.blend.replaymod.json +++ b/src/main/resources/mixins.render.blend.replaymod.json @@ -4,28 +4,13 @@ "mixins": [], "server": [], "client": [ - //#if MC>=10800 - //#if MC<11500 - //$$ "WorldRendererAccessor", - //$$ "MixinChunkRenderWorker", - //$$ "MixinEffectRenderer", - //$$ "MixinModelRenderer", - //$$ "MixinTileEntityRendererDispatcher", - //$$ "ContainerLocalRenderInformationAccessor", - //#endif - //#if MC<10904 - //$$ "EntityAccessor", - //#endif - //#if MC>=10904 - "ItemRendererAccessor", - //#endif - "ParticleAccessor", + "ItemRendererAccessor", + "ParticleAccessor", "Mixin_RenderGlobal", "MixinRenderItem", "MixinRenderLivingBase", "Mixin_RenderManager" - //#endif - ], + ], "compatibilityLevel": "JAVA_8", "minVersion": "0.6.11", "refmap": "mixins.replaymod.refmap.json" diff --git a/src/main/resources/mixins.render.replaymod.json b/src/main/resources/mixins.render.replaymod.json index a7a4bdb4..7da9e262 100644 --- a/src/main/resources/mixins.render.replaymod.json +++ b/src/main/resources/mixins.render.replaymod.json @@ -18,36 +18,17 @@ "Mixin_StabilizeCamera", "Mixin_Stereoscopic_Camera", "Mixin_Stereoscopic_HandRenderPass", - //#if MC>=10800 - //#if MC>=11500 - "Mixin_BlockOnChunkRebuilds", - //#else - //$$ "ChunkRenderDispatcherAccessor", - //$$ "MixinChunkRenderWorker", - //#endif - //#endif - //#if MC>=11400 - "Mixin_PreserveDepthDuringHandRendering", + "Mixin_BlockOnChunkRebuilds", + "Mixin_PreserveDepthDuringHandRendering", "Mixin_WindowsWorkaroundForTinyEXRNatives", - //#endif - "MainWindowAccessor", + "MainWindowAccessor", "WorldRendererAccessor", - //#if MC>=10904 - "MixinParticleManager", - //#else - //$$ "MixinEffectRenderer", - //#endif - "MixinEntityRenderer", - //#if MC>=10800 - "MixinGlStateManager", - //#endif - //#if MC>=10800 - //#else - //$$ "MixinOpenGlHelper", - //#endif - "MixinRenderManager" + "MixinParticleManager", + "MixinEntityRenderer", + "MixinGlStateManager", + "MixinRenderManager" ], "compatibilityLevel": "JAVA_8", "minVersion": "0.6.11", "refmap": "mixins.replaymod.refmap.json" -} \ No newline at end of file +} diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index 690b2f54..1c175b14 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -5,37 +5,19 @@ "mixins": [], "server": [], "client": [ - //#if MC>=11600 - "Mixin_MoveRealmsButton", - //#endif - //#if MC>=11400 - "MixinCamera", + "Mixin_MoveRealmsButton", + "MixinCamera", "MixinInGameHud", - //#endif - "com.replaymod.mixin.Mixin_EntityLivingBaseAccessor", - //#if MC>=11400 - "Mixin_ShowSpectatedHand_NoOF", + "com.replaymod.mixin.Mixin_EntityLivingBaseAccessor", + "Mixin_ShowSpectatedHand_NoOF", "Mixin_ShowSpectatedHand_OF", - //#else - //$$ "EntityOtherPlayerMPAccessor", - //#endif - "EntityPlayerAccessor", + "EntityPlayerAccessor", "FirstPersonRendererAccessor", - //#if MC>=10904 - "com.replaymod.mixin.Mixin_ParticleManager", - //#endif - //#if MC>=10800 - "MixinGuiSpectator", + "com.replaymod.mixin.Mixin_ParticleManager", + "MixinGuiSpectator", "MixinRenderArrow", - //#if MC<11400 - //$$ "MixinRenderManager", - //#endif - "MixinViewFrustum", - //#else - //$$ "MixinEntityRenderer", - //$$ "MixinFMLClientHandler", - //#endif - "com.replaymod.mixin.Mixin_KeyboardListener", + "MixinViewFrustum", + "com.replaymod.mixin.Mixin_KeyboardListener", "com.replaymod.mixin.Mixin_PlayerControllerMP", "com.replaymod.mixin.Mixin_RenderItem", "com.replaymod.mixin.Mixin_RenderLivingBase", diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 310520a1..dee9032f 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,16 +1,6 @@ { "pack": { "description": "ReplayMod resources", - //#if MC>=11600 - "pack_format": 6 - //#elseif MC>=11400 - //$$ "pack_format": 4 - //#else - //#if MC>=11002 - //$$ "pack_format": 2 - //#else - //$$ "pack_format": 1 - //#endif - //#endif - } + "pack_format": 6 + } }

* Only supported on Fabric builds, i.e. will always be false / crash the game with Forge/pre-1.14 builds. * (specifically the code below and MCVer#getProtocolVersion make this assumption) */ @@ -168,6 +164,7 @@ public Path getReplayPathForCache(Path cache) throws IOException { public static final FolderPack jGuiResourcePack = createJGuiResourcePack(); public static final String JGUI_RESOURCE_PACK_NAME = "replaymod_jgui"; + private static FolderPack createJGuiResourcePack() { File folder = new File("../jGui/src/main/resources"); if (!folder.exists()) { @@ -175,11 +172,7 @@ private static FolderPack createJGuiResourcePack() { } return new FolderPack(folder) { @Override - //#if MC>=11400 public String getName() { - //#else - //$$ public String getPackName() { - //#endif return JGUI_RESOURCE_PACK_NAME; } @@ -189,11 +182,7 @@ protected InputStream getInputStream(String resourceName) throws IOException { return super.getInputStream(resourceName); } catch (IOException e) { if ("pack.mcmeta".equals(resourceName)) { - //#if MC>=11400 int version = 4; - //#else - //$$ int version = 1; - //#endif return new ByteArrayInputStream(("{\"pack\": {\"description\": \"dummy pack for jGui resources in dev-env\", \"pack_format\": " + version + "}}").getBytes(StandardCharsets.UTF_8)); } @@ -222,11 +211,9 @@ public void initClient() { keyBindingRegistry.register(); // 1.7.10 crashes when render distance > 16 - //#if MC>=10800 if (!MCVer.hasOptifine()) { AbstractOption.RENDER_DISTANCE.setMaxValue(64f); } - //#endif runPostStartup(() -> { final long DAYS = 24 * 60 * 60 * 1000; @@ -378,29 +365,13 @@ public void printWarningToChat(String message, Object... args) { 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" - //#if MC>=10904 - //#if MC>=11600 Style coloredDarkGray = Style.EMPTY.setFormatting(TextFormatting.DARK_GRAY); Style coloredGold = Style.EMPTY.setFormatting(TextFormatting.GOLD); Style alert = Style.EMPTY.setFormatting(warning ? TextFormatting.RED : TextFormatting.DARK_GREEN); - //#else - //$$ Style coloredDarkGray = new Style().setColor(Formatting.DARK_GRAY); - //$$ Style coloredGold = new Style().setColor(Formatting.GOLD); - //$$ Style alert = new Style().setColor(warning ? Formatting.RED : Formatting.DARK_GREEN); - //#endif ITextComponent text = new StringTextComponent("[").setStyle(coloredDarkGray) .appendSibling(new TranslationTextComponent("replaymod.title").setStyle(coloredGold)) .appendSibling(new StringTextComponent("] ")) .appendSibling(new TranslationTextComponent(message, args).setStyle(alert)); - //#else - //$$ 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))); - //#endif // 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); diff --git a/src/main/java/com/replaymod/core/ReplayModBackend.java b/src/main/java/com/replaymod/core/ReplayModBackend.java index 43a32254..2fe34013 100644 --- a/src/main/java/com/replaymod/core/ReplayModBackend.java +++ b/src/main/java/com/replaymod/core/ReplayModBackend.java @@ -1,24 +1,10 @@ package com.replaymod.core; -import com.mojang.bridge.launcher.Launcher; -import com.replaymod.mixin.MinecraftAccessor; import com.replaymod.core.versions.forge.EventsAdapter; -import com.replaymod.extras.modcore.ModCoreInstaller; -import net.minecraft.resources.IResourcePack; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.javafmlmod.FMLModContainer; -import org.spongepowered.asm.launch.MixinBootstrap; -import org.spongepowered.asm.mixin.MixinEnvironment; -import org.spongepowered.asm.mixin.Mixins; - -import java.util.List; - -import static com.replaymod.core.ReplayMod.MOD_ID; -import static com.replaymod.core.ReplayMod.jGuiResourcePack; -import static com.replaymod.core.versions.MCVer.getMinecraft; @Mod(ReplayMod.MOD_ID) public class ReplayModBackend { diff --git a/src/main/java/com/replaymod/core/ReplayModMMLauncher.java b/src/main/java/com/replaymod/core/ReplayModMMLauncher.java index bd9606a0..e69de29b 100644 --- a/src/main/java/com/replaymod/core/ReplayModMMLauncher.java +++ b/src/main/java/com/replaymod/core/ReplayModMMLauncher.java @@ -1,74 +0,0 @@ -//#if FABRIC>=1 -//$$ package com.replaymod.core; -//$$ -//$$ import com.replaymod.extras.modcore.ModCoreInstaller; -//$$ import net.fabricmc.loader.api.FabricLoader; -//$$ import net.fabricmc.loader.api.ModContainer; -//$$ import org.spongepowered.asm.mixin.Mixins; -//$$ -//$$ import java.io.File; -//$$ import java.util.Optional; -//$$ -//$$ // We need to wait for MM to call us, otherwise we might initialize our mixins before it calls optifabric which would -//$$ // result in OF classes not existing while our mixins get resolved. -//$$ public class ReplayModMMLauncher implements Runnable { -//$$ private static boolean ran; -//$$ -//$$ @Override -//$$ public void run() { -//$$ // If this is MM2, then we're currently getting called because of our entrypoint declaration. -//$$ // For backwards compatibility with MM1, we also declare our early_riser via custom metadata and MM2 supports -//$$ // that as well and will therefore call us twice. -//$$ if (ran) { -//$$ return; -//$$ } -//$$ ran = true; -//$$ -//$$ Mixins.addConfiguration("mixins.compat.mapwriter.replaymod.json"); -//$$ Mixins.addConfiguration("mixins.compat.shaders.replaymod.json"); -//$$ Mixins.addConfiguration("mixins.core.replaymod.json"); -//$$ Mixins.addConfiguration("mixins.extras.playeroverview.replaymod.json"); -//$$ Mixins.addConfiguration("mixins.recording.replaymod.json"); -//$$ Mixins.addConfiguration("mixins.render.blend.replaymod.json"); -//$$ Mixins.addConfiguration("mixins.render.replaymod.json"); -//$$ Mixins.addConfiguration("mixins.replay.replaymod.json"); -//$$ -//$$ try { -//$$ initModCore(); -//$$ } catch (Throwable t) { -//$$ System.err.println("ReplayMod caught error during ModCore init:"); -//$$ t.printStackTrace(); -//$$ } -//$$ } -//$$ -//$$ // Forge equivalent is in ReplayModTweaker -//$$ private void initModCore() { -//$$ if (System.getProperty("REPLAYMOD_SKIP_MODCORE", "false").equalsIgnoreCase("true")) { -//$$ System.out.println("ReplayMod not initializing ModCore because REPLAYMOD_SKIP_MODCORE is true."); -//$$ return; -//$$ } -//$$ -//$$ if (FabricLoader.getInstance().isDevelopmentEnvironment()) { -//$$ System.out.println("ReplayMod not initializing ModCore because we're in a development environment."); -//$$ return; -//$$ } -//$$ -//$$ File gameDir = FabricLoader.getInstance().getGameDirectory(); -//$$ -//$$ Optional minecraft = FabricLoader.getInstance().getModContainer("minecraft"); -//$$ if (!minecraft.isPresent()) { -//$$ System.err.println("ReplayMod could not determine Minecraft version, skipping ModCore."); -//$$ return; -//$$ } -//$$ String mcVer = minecraft.get().getMetadata().getVersion().getFriendlyString(); -//$$ -//$$ int result = ModCoreInstaller.initialize(gameDir, mcVer + "_fabric"); -//$$ if (result != -2) { // Don't even bother logging the result if there's no ModCore for this version. -//$$ System.out.println("ReplayMod ModCore init result: " + result); -//$$ } -//$$ if (ModCoreInstaller.isErrored()) { -//$$ System.err.println(ModCoreInstaller.getError()); -//$$ } -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/core/ReplayModMixinConfigPlugin.java b/src/main/java/com/replaymod/core/ReplayModMixinConfigPlugin.java index 08259e21..6ca71590 100644 --- a/src/main/java/com/replaymod/core/ReplayModMixinConfigPlugin.java +++ b/src/main/java/com/replaymod/core/ReplayModMixinConfigPlugin.java @@ -2,34 +2,20 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; import java.io.IOException; +import java.io.InputStream; import java.util.List; import java.util.Set; -//#if MC>=11400 -import java.io.InputStream; -//#else -//$$ import net.minecraft.launchwrapper.Launch; -//#endif - -//#if MC>=11200 -import org.objectweb.asm.tree.ClassNode; -//#else -//$$ import org.spongepowered.asm.lib.tree.ClassNode; -//#endif - public class ReplayModMixinConfigPlugin implements IMixinConfigPlugin { static boolean hasClass(String name) throws IOException { - //#if MC>=11400 InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(name.replace('.', '/') + ".class"); if (stream != null) stream.close(); return stream != null; - //#else - //$$ return Launch.classLoader.getClassBytes(name) != null; - //#endif } private final Logger logger = LogManager.getLogger("replaymod/mixin"); @@ -42,10 +28,8 @@ static boolean hasClass(String name) throws IOException { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { if (hasOF) { - //#if MC>=11500 // OF renames the lambda method name and I see no way we can target it now, so we give up on that patch if (mixinClassName.endsWith("MixinTileEntityEndPortalRenderer")) return false; - //#endif } if (mixinClassName.endsWith("_OF")) return hasOF; if (mixinClassName.endsWith("_NoOF")) return !hasOF; diff --git a/src/main/java/com/replaymod/core/ReplayModNonMMLauncher.java b/src/main/java/com/replaymod/core/ReplayModNonMMLauncher.java index 283cb69f..e69de29b 100644 --- a/src/main/java/com/replaymod/core/ReplayModNonMMLauncher.java +++ b/src/main/java/com/replaymod/core/ReplayModNonMMLauncher.java @@ -1,62 +0,0 @@ -//#if FABRIC>=1 -//$$ package com.replaymod.core; -//$$ -//$$ import org.apache.logging.log4j.LogManager; -//$$ import org.apache.logging.log4j.Logger; -//$$ import org.objectweb.asm.tree.ClassNode; -//$$ import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -//$$ import org.spongepowered.asm.mixin.extensibility.IMixinInfo; -//$$ -//$$ import java.io.IOException; -//$$ import java.util.List; -//$$ import java.util.Set; -//$$ -//$$ // See ReplayModMMLauncher. This is the fallback if MM is not installed. -//$$ public class ReplayModNonMMLauncher implements IMixinConfigPlugin { -//$$ private final Logger logger = LogManager.getLogger("replaymod/nonmm"); -//$$ -//$$ @Override -//$$ public void onLoad(String mixinPackage) { -//$$ } -//$$ -//$$ @Override -//$$ public String getRefMapperConfig() { -//$$ return null; -//$$ } -//$$ -//$$ @Override -//$$ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { -//$$ return false; -//$$ } -//$$ -//$$ @Override -//$$ public void acceptTargets(Set myTargets, Set otherTargets) { -//$$ -//$$ } -//$$ -//$$ @Override -//$$ public List getMixins() { -//$$ try { -//$$ if (ReplayModMixinConfigPlugin.hasClass("com.chocohead.mm.Plugin")) { -//$$ logger.debug("Detected MM, they should call us..."); -//$$ } else { -//$$ logger.debug("Did not detect MM, initializing ourselves..."); -//$$ new ReplayModMMLauncher().run(); -//$$ } -//$$ return null; -//$$ } catch (IOException e) { -//$$ throw new RuntimeException(e); -//$$ } -//$$ } -//$$ -//$$ @Override -//$$ public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { -//$$ -//$$ } -//$$ -//$$ @Override -//$$ public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { -//$$ -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/core/SettingsRegistry.java b/src/main/java/com/replaymod/core/SettingsRegistry.java index 79bbcb60..58589892 100644 --- a/src/main/java/com/replaymod/core/SettingsRegistry.java +++ b/src/main/java/com/replaymod/core/SettingsRegistry.java @@ -56,8 +56,11 @@ public void save() { public interface SettingKey { String getCategory(); + String getKey(); + String getDisplayString(); + T getDefault(); } diff --git a/src/main/java/com/replaymod/core/SettingsRegistryBackend.java b/src/main/java/com/replaymod/core/SettingsRegistryBackend.java index bbc15cf0..4b88070e 100644 --- a/src/main/java/com/replaymod/core/SettingsRegistryBackend.java +++ b/src/main/java/com/replaymod/core/SettingsRegistryBackend.java @@ -1,11 +1,6 @@ package com.replaymod.core; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; +import com.google.gson.*; import com.replaymod.core.events.SettingsChangedCallback; import net.minecraft.client.Minecraft; import org.apache.logging.log4j.LogManager; @@ -13,12 +8,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardWatchEventKinds; -import java.nio.file.WatchEvent; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; +import java.nio.file.*; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/replaymod/core/events/KeyEventCallback.java b/src/main/java/com/replaymod/core/events/KeyEventCallback.java index f7fa6e0d..77a40564 100644 --- a/src/main/java/com/replaymod/core/events/KeyEventCallback.java +++ b/src/main/java/com/replaymod/core/events/KeyEventCallback.java @@ -14,13 +14,8 @@ public interface KeyEventCallback { } ); - //#if MC>=11400 int ACTION_RELEASE = org.lwjgl.glfw.GLFW.GLFW_RELEASE; int ACTION_PRESS = org.lwjgl.glfw.GLFW.GLFW_PRESS; - //#else - //$$ int ACTION_RELEASE = 0; - //$$ int ACTION_PRESS = 1; - //#endif boolean onKeyEvent(int key, int scanCode, int action, int modifiers); } diff --git a/src/main/java/com/replaymod/core/events/PostRenderWorldCallback.java b/src/main/java/com/replaymod/core/events/PostRenderWorldCallback.java index 9008ef2f..0d5caa3b 100644 --- a/src/main/java/com/replaymod/core/events/PostRenderWorldCallback.java +++ b/src/main/java/com/replaymod/core/events/PostRenderWorldCallback.java @@ -1,7 +1,7 @@ package com.replaymod.core.events; -import com.replaymod.gui.utils.Event; import com.mojang.blaze3d.matrix.MatrixStack; +import com.replaymod.gui.utils.Event; public interface PostRenderWorldCallback { Event EVENT = Event.create((listeners) -> diff --git a/src/main/java/com/replaymod/core/gui/GuiBackgroundProcesses.java b/src/main/java/com/replaymod/core/gui/GuiBackgroundProcesses.java index 3307e7f9..b3d9d05a 100644 --- a/src/main/java/com/replaymod/core/gui/GuiBackgroundProcesses.java +++ b/src/main/java/com/replaymod/core/gui/GuiBackgroundProcesses.java @@ -10,18 +10,22 @@ import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.VerticalLayout; import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.gui.versions.callbacks.InitScreenCallback; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import com.replaymod.gui.versions.callbacks.InitScreenCallback; import static com.replaymod.core.versions.MCVer.getMinecraft; public class GuiBackgroundProcesses extends EventRegistrations { private GuiPanel panel = new GuiPanel().setLayout(new VerticalLayout().setSpacing(10)); - { on(InitScreenCallback.EVENT, (screen, buttons) -> onGuiInit(screen)); } + { + on(InitScreenCallback.EVENT, (screen, buttons) -> onGuiInit(screen)); + } + private void onGuiInit(net.minecraft.client.gui.screen.Screen guiScreen) { - if (guiScreen != getMinecraft().currentScreen) return; // people tend to construct GuiScreens without opening them + if (guiScreen != getMinecraft().currentScreen) + return; // people tend to construct GuiScreens without opening them VanillaGuiScreen vanillaGui = VanillaGuiScreen.wrap(guiScreen); vanillaGui.setLayout(new CustomLayout(vanillaGui.getLayout()) { diff --git a/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java b/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java index 8c93f4a6..102bd40e 100644 --- a/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java +++ b/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java @@ -39,8 +39,7 @@ public void run() { if (key.getDisplayString() != null) { GuiElement element; if (key.getDefault() instanceof Boolean) { - @SuppressWarnings("unchecked") - final SettingsRegistry.SettingKey booleanKey = (SettingsRegistry.SettingKey) key; + @SuppressWarnings("unchecked") final SettingsRegistry.SettingKey booleanKey = (SettingsRegistry.SettingKey) key; final GuiToggleButton button = new GuiToggleButton<>().setSize(150, 20) .setI18nLabel(key.getDisplayString()).setSelected(settingsRegistry.get(booleanKey) ? 0 : 1) .setValues(I18n.format("options.on"), I18n.format("options.off")); diff --git a/src/main/java/com/replaymod/core/gui/ModMenuApiImpl.java b/src/main/java/com/replaymod/core/gui/ModMenuApiImpl.java index 04cc9341..e69de29b 100644 --- a/src/main/java/com/replaymod/core/gui/ModMenuApiImpl.java +++ b/src/main/java/com/replaymod/core/gui/ModMenuApiImpl.java @@ -1,21 +0,0 @@ -//#if FABRIC>=1 -//$$ package com.replaymod.core.gui; -//$$ -//$$ import com.replaymod.core.ReplayMod; -//$$ import io.github.prospector.modmenu.api.ModMenuApi; -//$$ import net.minecraft.client.gui.screen.Screen; -//$$ -//$$ import java.util.function.Function; -//$$ -//$$ public class ModMenuApiImpl implements ModMenuApi { -//$$ @Override -//$$ public String getModId() { -//$$ return ReplayMod.MOD_ID; -//$$ } -//$$ -//$$ @Override -//$$ public Function getConfigScreenFactory() { -//$$ return parent -> new GuiReplaySettings(parent, ReplayMod.instance.getSettingsRegistry()).toMinecraft(); -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/core/gui/RestoreReplayGui.java b/src/main/java/com/replaymod/core/gui/RestoreReplayGui.java index a2ccc96c..ef94bf96 100644 --- a/src/main/java/com/replaymod/core/gui/RestoreReplayGui.java +++ b/src/main/java/com/replaymod/core/gui/RestoreReplayGui.java @@ -5,10 +5,6 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; -import com.replaymod.replaystudio.io.ReplayInputStream; -import com.replaymod.replaystudio.io.ReplayOutputStream; -import com.replaymod.replaystudio.replay.ReplayFile; -import com.replaymod.replaystudio.replay.ReplayMetaData; import com.replaymod.gui.container.AbstractGuiScreen; import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.container.GuiScreen; @@ -20,6 +16,10 @@ import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.layout.VerticalLayout; import com.replaymod.gui.utils.Colors; +import com.replaymod.replaystudio.io.ReplayInputStream; +import com.replaymod.replaystudio.io.ReplayOutputStream; +import com.replaymod.replaystudio.replay.ReplayFile; +import com.replaymod.replaystudio.replay.ReplayMetaData; import net.minecraft.crash.CrashReport; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -53,9 +53,9 @@ public RestoreReplayGui(ReplayMod core, GuiScreen parent, File file) { this.file = file; textPanel.addElements(new VerticalLayout.Data(0.5), - new GuiLabel().setI18nText("replaymod.gui.restorereplay1"), - new GuiLabel().setI18nText("replaymod.gui.restorereplay2", Files.getNameWithoutExtension(file.getName())), - new GuiLabel().setI18nText("replaymod.gui.restorereplay3")); + new GuiLabel().setI18nText("replaymod.gui.restorereplay1"), + new GuiLabel().setI18nText("replaymod.gui.restorereplay2", Files.getNameWithoutExtension(file.getName())), + new GuiLabel().setI18nText("replaymod.gui.restorereplay3")); yesButton.onClick(() -> { recoverInBackground(); parent.display(); @@ -100,7 +100,8 @@ private void recoverInBackground() { } catch (IOException e) { LOGGER.error("Recovering replay file:", e); CrashReport crashReport = CrashReport.makeCrashReport(e, "Recovering replay file"); - core.runLater(() -> Utils.error(LOGGER, VanillaGuiScreen.wrap(getMinecraft().currentScreen), crashReport, () -> {})); + core.runLater(() -> Utils.error(LOGGER, VanillaGuiScreen.wrap(getMinecraft().currentScreen), crashReport, () -> { + })); } finally { core.runLater(() -> core.getBackgroundProcesses().removeProcess(savingProcess)); } diff --git a/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java b/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java index 0e4bb1ae..32e3a8d1 100644 --- a/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java +++ b/src/main/java/com/replaymod/core/tweaker/ReplayModTweaker.java @@ -14,9 +14,7 @@ import java.net.URISyntaxException; import java.util.List; -//#if MC>=11200 import org.spongepowered.asm.launch.platform.container.ContainerHandleURI; -//#endif // Fabric equivalent is in ReplayModMMLauncher public class ReplayModTweaker implements ITweaker { @@ -70,19 +68,10 @@ public void injectIntoClassLoader(LaunchClassLoader classLoader) { throw new RuntimeException(e); } MixinPlatformManager platform = MixinBootstrap.getPlatform(); - //#if MC>=11200 - platform.addContainer(new ContainerHandleURI(uri)); - //#else - //$$ platform.addContainer(uri); - //#endif - - //#if MC>=11202 && MC<=11202 - initModCore("1.12.2"); - //#endif - //#if MC>=10809 && MC<=10809 - //$$ initModCore("1.8.9"); - //#endif - } + platform.addContainer(new ContainerHandleURI(uri)); + + initModCore("1.12.2"); + } @Override public String getLaunchTarget() { diff --git a/src/main/java/com/replaymod/core/utils/ModCompat.java b/src/main/java/com/replaymod/core/utils/ModCompat.java index 44a6173b..ae02b763 100644 --- a/src/main/java/com/replaymod/core/utils/ModCompat.java +++ b/src/main/java/com/replaymod/core/utils/ModCompat.java @@ -12,6 +12,7 @@ public static Collection getInstalledNetworkMods() { public static final class ModInfoDifference { private final Set missing = new HashSet<>(); private final Map differing = new HashMap<>(); + public ModInfoDifference(Collection requiredList) { Collection installedList = getInstalledNetworkMods(); REQUIRED: diff --git a/src/main/java/com/replaymod/core/utils/ModInfoGetter.java b/src/main/java/com/replaymod/core/utils/ModInfoGetter.java index 1883a24f..f0a0c560 100644 --- a/src/main/java/com/replaymod/core/utils/ModInfoGetter.java +++ b/src/main/java/com/replaymod/core/utils/ModInfoGetter.java @@ -1,22 +1,14 @@ package com.replaymod.core.utils; import com.replaymod.replaystudio.data.ModInfo; -import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.ModList; -import net.minecraftforge.registries.ForgeRegistry; -import net.minecraftforge.registries.GameData; import java.util.Collection; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; class ModInfoGetter { static Collection getInstalledNetworkMods() { - return ModList.get().getMods().stream() + return ModList.get().getMods().stream() .map(mod -> new ModInfo(mod.getModId(), mod.getModId(), mod.getVersion().toString())) .collect(Collectors.toList()); } diff --git a/src/main/java/com/replaymod/core/utils/Restrictions.java b/src/main/java/com/replaymod/core/utils/Restrictions.java index 6e133e8b..e06ed03c 100644 --- a/src/main/java/com/replaymod/core/utils/Restrictions.java +++ b/src/main/java/com/replaymod/core/utils/Restrictions.java @@ -1,36 +1,24 @@ package com.replaymod.core.utils; -import net.minecraft.network.play.server.SCustomPayloadPlayPacket; import net.minecraft.network.PacketBuffer; -//#if MC>=10904 +import net.minecraft.network.play.server.SCustomPayloadPlayPacket; import net.minecraft.util.ResourceLocation; -//#endif -//#if MC<=10710 -//$$ import io.netty.buffer.Unpooled; -//#endif /** * Restrictions set by the server, + * * @see Replay Restrictions Gist */ public class Restrictions { - //#if MC>=11400 public static final ResourceLocation PLUGIN_CHANNEL = new ResourceLocation("replaymod", "restrict"); - //#else - //$$ public static final String PLUGIN_CHANNEL = "Replay|Restrict"; - //#endif private boolean noXray; private boolean noNoclip; private boolean onlyFirstPerson; private boolean onlyRecordingPlayer; public String handle(SCustomPayloadPlayPacket packet) { - //#if MC>=10800 PacketBuffer buffer = packet.getBufferData(); - //#else - //$$ PacketBuffer buffer = new PacketBuffer(Unpooled.wrappedBuffer(packet.func_149168_d())); - //#endif while (buffer.isReadable()) { String name = buffer.readString(64); boolean active = buffer.readBoolean(); @@ -43,7 +31,7 @@ public String handle(SCustomPayloadPlayPacket packet) { // } else if ("only_recording_player".equals(name)) { // onlyRecordingPlayer = active; // } else { - return name; + return name; // } } return null; diff --git a/src/main/java/com/replaymod/core/utils/Utils.java b/src/main/java/com/replaymod/core/utils/Utils.java index 8775f415..d8ea1ea6 100644 --- a/src/main/java/com/replaymod/core/utils/Utils.java +++ b/src/main/java/com/replaymod/core/utils/Utils.java @@ -6,7 +6,6 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.replaymod.core.ReplayMod; -import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersion; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.AbstractGuiScrollable; @@ -20,11 +19,14 @@ import com.replaymod.gui.layout.VerticalLayout; import com.replaymod.gui.popup.GuiInfoPopup; import com.replaymod.gui.utils.Colors; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.Image; import com.replaymod.gui.versions.MCVer; +import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersion; +import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; +import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.network.play.NetworkPlayerInfo; +import net.minecraft.client.resources.DefaultPlayerSkin; import net.minecraft.crash.CrashReport; import net.minecraft.util.ResourceLocation; import org.apache.commons.io.Charsets; @@ -32,20 +34,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -//#if MC>=11400 -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif - -//#if MC>=10800 -import net.minecraft.client.network.play.NetworkPlayerInfo; -import net.minecraft.client.resources.DefaultPlayerSkin; -//#else -//$$ import net.minecraft.client.Minecraft; -//$$ import net.minecraft.client.entity.AbstractClientPlayer; -//$$ import net.minecraft.entity.player.EntityPlayer; -//#endif - import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.net.ssl.SSLContext; @@ -98,6 +86,7 @@ private static InputStream getResourceAsStream(String path) { * Java keystore prior to 8u101. * Therefore whenever a connection to the replaymod.com site is made, this SSLContext has to be used instead. * It has been constructed to include the necessary root certificates. + * * @see #SSL_SOCKET_FACTORY */ public static final SSLContext SSL_CONTEXT; @@ -109,7 +98,7 @@ private static InputStream getResourceAsStream(String path) { static { // Largely from https://community.letsencrypt.org/t/134/37 - try (InputStream in = getResourceAsStream("/dst_root_ca_x3.pem")){ + try (InputStream in = getResourceAsStream("/dst_root_ca_x3.pem")) { Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate(in); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); @@ -129,12 +118,12 @@ private static InputStream getResourceAsStream(String path) { } public static String convertSecondsToShortString(int seconds) { - int hours = seconds/(60*60); - int min = seconds/60 - hours*60; - int sec = seconds - ((min*60) + (hours*60*60)); + int hours = seconds / (60 * 60); + int min = seconds / 60 - hours * 60; + int sec = seconds - ((min * 60) + (hours * 60 * 60)); StringBuilder builder = new StringBuilder(); - if(hours > 0) builder.append(String.format("%02d", hours)).append(":"); + if (hours > 0) builder.append(String.format("%02d", hours)).append(":"); builder.append(String.format("%02d", min)).append(":"); builder.append(String.format("%02d", sec)); @@ -181,39 +170,19 @@ public static String fileNameToReplayName(String fileName) { } public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) { - //#if MC>=10800 NetworkPlayerInfo info = getMinecraft().getConnection().getPlayerInfo(uuid); ResourceLocation skinLocation; - //#if FABRIC>=1 - //$$ if (info != null && info.hasSkinTexture()) { - //$$ skinLocation = info.getSkinTexture(); - //$$ } else { - //$$ skinLocation = DefaultSkinHelper.getTexture(uuid); - //$$ } - //#else if (info != null && info.hasLocationSkin()) { - skinLocation = info.getLocationSkin(); + skinLocation = info.getLocationSkin(); } else { - skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid); + skinLocation = DefaultPlayerSkin.getDefaultSkin(uuid); } - //#endif return skinLocation; - //#else - //$$ EntityPlayer player = Minecraft.getMinecraft().theWorld.getPlayerEntityByUUID(uuid); - //$$ if (player != null || !(player instanceof AbstractClientPlayer)) { - //$$ return AbstractClientPlayer.locationStevePng; - //$$ } - //$$ return ((AbstractClientPlayer) player).getLocationSkin(); - //#endif } public static boolean isCtrlDown() { - //#if MC>=11400 return Screen.hasControlDown(); - //#else - //$$ return Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); - //#endif } public static void addCallback(ListenableFuture future, Consumer onSuccess, Consumer onFailure) { @@ -274,7 +243,7 @@ public GuiCrashReportPopup(GuiContainer container, String crashReport) { new GuiLabel().setColor(Colors.BLACK).setI18nText("replaymod.gui.unknownerror"), scrollable = new GuiScrollable().setScrollDirection(AbstractGuiScrollable.Direction.VERTICAL) .setLayout(new VerticalLayout().setSpacing(2)) - .addElements(null,Arrays.stream(crashReport.replace("\t", " ").split("\n")).map( + .addElements(null, Arrays.stream(crashReport.replace("\t", " ").split("\n")).map( l -> new GuiLabel().setText(l).setColor(Colors.BLACK)).toArray(GuiElement[]::new))); // Replace close button with panel containing close and copy buttons @@ -303,6 +272,7 @@ public static void throwIfInstanceOf(Throwable t, Class throw cls.cast(t); } } + public static void throwIfUnchecked(Throwable t) { if (t instanceof RuntimeException) { throw (RuntimeException) t; diff --git a/src/main/java/com/replaymod/core/utils/WrappedTimer.java b/src/main/java/com/replaymod/core/utils/WrappedTimer.java index 8eaf1118..09cc7cf4 100644 --- a/src/main/java/com/replaymod/core/utils/WrappedTimer.java +++ b/src/main/java/com/replaymod/core/utils/WrappedTimer.java @@ -9,37 +9,22 @@ public class WrappedTimer extends Timer { protected final Timer wrapped; public WrappedTimer(Timer wrapped) { - //#if MC>=11400 super(0, 0); - //#else - //$$ super(0); - //#endif this.wrapped = wrapped; copy(wrapped, this); } @Override - public - //#if MC>=11600 - int - //#else - //$$ void - //#endif + public int getPartialTicks( - //#if MC>=11400 long sysClock - //#endif ) { copy(this, wrapped); try { - //#if MC>=11600 return - //#endif - wrapped.getPartialTicks( - //#if MC>=11400 - sysClock - //#endif - ); + wrapped.getPartialTicks( + sysClock + ); } finally { copy(wrapped, this); } @@ -49,21 +34,9 @@ protected void copy(Timer from, Timer to) { TimerAccessor fromA = (TimerAccessor) from; TimerAccessor toA = (TimerAccessor) to; - //#if MC<11600 - //$$ to.ticksThisFrame = from.ticksThisFrame; - //#endif to.renderPartialTicks = from.renderPartialTicks; toA.setLastSyncSysClock(fromA.getLastSyncSysClock()); to.elapsedPartialTicks = from.elapsedPartialTicks; - //#if MC>=11200 toA.setTickLength(fromA.getTickLength()); - //#else - //$$ toA.setTicksPerSecond(fromA.getTicksPerSecond()); - //$$ toA.setLastHRTime(fromA.getLastHRTime()); - //$$ toA.setTimerSpeed(fromA.getTimerSpeed()); - //$$ toA.setLastSyncHRClock(fromA.getLastSyncHRClock()); - //$$ toA.setCounter(fromA.getCounter()); - //$$ toA.setTimeSyncAdjustment(fromA.getTimeSyncAdjustment()); - //#endif } } diff --git a/src/main/java/com/replaymod/core/versions/LangResourcePack.java b/src/main/java/com/replaymod/core/versions/LangResourcePack.java index 53823b24..38723cda 100644 --- a/src/main/java/com/replaymod/core/versions/LangResourcePack.java +++ b/src/main/java/com/replaymod/core/versions/LangResourcePack.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.core.versions; import com.google.gson.Gson; @@ -16,31 +15,12 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -//#if FABRIC>=1 -//$$ import net.fabricmc.loader.api.FabricLoader; -//$$ import net.fabricmc.loader.api.ModContainer; -//#else -//#endif - -//#if MC>=11400 -//#else -//$$ import net.minecraft.resources.IPackFinder; -//$$ import net.minecraft.resources.ResourcePackInfo; -//$$ import net.minecraftforge.fml.loading.moddiscovery.ModFile; -//$$ import net.minecraftforge.fml.packs.ModFileResourcePack; -//$$ import net.minecraftforge.fml.packs.ResourcePackLoader; -//#endif /** * Resource pack which on-the-fly converts pre-1.13 language files into 1.13 json format. @@ -52,30 +32,16 @@ public class LangResourcePack extends ResourcePack { private static final Pattern JSON_FILE_PATTERN = Pattern.compile("^assets/" + ReplayMod.MOD_ID + "/lang/([a-z][a-z])_([a-z][a-z]).json$"); private static final Pattern LANG_FILE_NAME_PATTERN = Pattern.compile("^([a-z][a-z])_([a-z][a-z]).lang$"); - //#if MC>=11400 public static final String LEGACY_KEY_PREFIX = "replaymod.input."; private static final String FABRIC_KEY_FORMAT = "key." + ReplayMod.MOD_ID + ".%s"; private final Path basePath; + public LangResourcePack() { super(new File(NAME)); - //#if FABRIC>=1 - //$$ ModContainer container = FabricLoader.getInstance().getModContainer(ReplayMod.MOD_ID).orElseThrow(IllegalAccessError::new); - //$$ this.basePath = container.getRootPath(); - //#else this.basePath = null; // stub - //#endif } - //#else - //$$ public LangResourcePack() { - //$$ super(new File(NAME)); - //$$ } - //$$ - //$$ private ModFileResourcePack getParent() { - //$$ return ResourcePackLoader.getResourcePackFor(ReplayMod.MOD_ID).orElseThrow(() -> new RuntimeException("Failed to get ReplayMod resource pack!")); - //$$ } - //#endif private String langName(String path) { Matcher matcher = JSON_FILE_PATTERN.matcher(path); @@ -83,26 +49,14 @@ private String langName(String path) { return String.format("%s_%s.lang", matcher.group(1), matcher.group(2).toUpperCase()); } - //#if MC>=11400 private Path baseLangPath() { return basePath.resolve("assets").resolve(ReplayMod.MOD_ID).resolve("lang"); } - //#else - //$$ private Path baseLangPath() { - //$$ ModFileResourcePack parent = getParent(); - //$$ if (parent == null) return null; - //$$ ModFile modFile = parent.getModFile(); - //$$ return modFile.getLocator().findPath(modFile, "assets", ReplayMod.MOD_ID, "lang"); - //$$ } - //#endif private Path langPath(String path) { String langName = langName(path); if (langName == null) return null; Path basePath = baseLangPath(); - //#if MC<11400 - //$$ if (basePath == null) return null; - //#endif return basePath.resolve(langName); } @@ -131,13 +85,11 @@ protected InputStream getInputStream(String path) throws IOException { String key = line.substring(0, i); String value = line.substring(i + 1); value = convertValue(value); - //#if MC>=11400 if (key.startsWith(LEGACY_KEY_PREFIX)) { // Duplicating instead of just remapping as some other part of the UI may still rely on the old key properties.put(key, value); key = String.format(FABRIC_KEY_FORMAT, key.substring(LEGACY_KEY_PREFIX.length())); } - //#endif properties.put(key, value); } @@ -154,18 +106,13 @@ protected boolean resourceExists(String path) { @Override public Collection getAllResourceLocations( ResourcePackType resourcePackType, - //#if MC>=11500 String namespace, - //#endif String path, int maxDepth, Predicate filter ) { if (resourcePackType == ResourcePackType.CLIENT_RESOURCES && "lang".equals(path)) { Path base = baseLangPath(); - //#if MC<11400 - //$$ if (base == null) return Collections.emptyList(); - //#endif try { return Files.walk(base, 1) .skip(1) @@ -196,16 +143,8 @@ public Set getResourceNamespaces(ResourcePackType resourcePackType) { } @Override - public void close() {} + public void close() { + } // Not needed on fabric, using MixinModResourcePackUtil instead. - //#if MC<11400 - //$$ public static class Finder implements IPackFinder { - //$$ @Override - //$$ public void addPackInfosToMap(Map packList, ResourcePackInfo.IFactory factory) { - //$$ packList.put(NAME, ResourcePackInfo.func_195793_a(NAME, true, LangResourcePack::new, factory, ResourcePackInfo.Priority.BOTTOM)); - //$$ } - //$$ } - //#endif } -//#endif diff --git a/src/main/java/com/replaymod/core/versions/MCVer.java b/src/main/java/com/replaymod/core/versions/MCVer.java index c47fd620..860f9bcf 100644 --- a/src/main/java/com/replaymod/core/versions/MCVer.java +++ b/src/main/java/com/replaymod/core/versions/MCVer.java @@ -1,90 +1,41 @@ package com.replaymod.core.versions; -import com.replaymod.mixin.GuiScreenAccessor; import com.replaymod.core.MinecraftMethodAccessor; +import com.replaymod.mixin.GuiScreenAccessor; +import com.replaymod.mixin.MainWindowAccessor; +import com.replaymod.mixin.ParticleAccessor; import com.replaymod.replaystudio.protocol.PacketTypeRegistry; import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersion; import com.replaymod.replaystudio.us.myles.ViaVersion.packets.State; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.util.Util; - -//#if MC>=11600 -import net.minecraft.resources.IPackNameDecorator; -//#endif - -//#if MC>=11400 -import com.replaymod.mixin.MainWindowAccessor; -import net.minecraft.util.SharedConstants; -import net.minecraft.client.shader.Framebuffer; -import net.minecraft.client.gui.widget.button.Button; import net.minecraft.client.gui.widget.Widget; - -import java.util.concurrent.CompletableFuture; - -//#if MC>=11600 -import net.minecraft.util.text.TranslationTextComponent; -//#else -//$$ import net.minecraft.client.resource.language.I18n; -//#endif -//#else -//$$ import com.google.common.util.concurrent.FutureCallback; -//$$ import com.google.common.util.concurrent.Futures; -//$$ import com.google.common.util.concurrent.ListenableFuture; -//$$ import net.minecraft.client.gui.GuiButton; -//$$ import net.minecraft.realms.RealmsSharedConstants; -//#endif - -//#if MC>=11400 -import net.minecraft.client.util.InputMappings; -import org.lwjgl.glfw.GLFW; -//#else -//$$ import net.minecraft.client.resources.ResourcePackRepository; -//$$ import net.minecraftforge.fml.client.FMLClientHandler; -//$$ import org.apache.logging.log4j.LogManager; -//$$ import org.lwjgl.Sys; -//$$ import java.awt.Desktop; -//$$ import java.io.IOException; -//#endif - -//#if MC>=10904 -import com.replaymod.mixin.ParticleAccessor; +import net.minecraft.client.gui.widget.button.Button; import net.minecraft.client.particle.Particle; -import net.minecraft.util.math.vector.Vector3d; -//#endif - -//#if MC>=10800 import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormatElement; -//#if MC<11500 -//$$ import net.minecraft.client.render.chunk.ChunkRenderTask; -//#endif -//#else -//$$ import com.replaymod.core.mixin.ResourcePackRepositoryAccessor; -//$$ import io.netty.handler.codec.DecoderException; -//$$ import net.minecraft.client.renderer.entity.RenderManager; -//$$ import net.minecraft.client.resources.FileResourcePack; -//$$ import net.minecraft.network.PacketBuffer; -//$$ -//$$ import static org.lwjgl.opengl.GL11.*; -//#endif +import net.minecraft.client.shader.Framebuffer; +import net.minecraft.client.util.InputMappings; +import net.minecraft.resources.IPackNameDecorator; +import net.minecraft.util.SharedConstants; +import net.minecraft.util.Util; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.text.TranslationTextComponent; +import org.lwjgl.glfw.GLFW; import java.io.File; import java.net.URI; import java.util.List; -import java.util.function.Consumer; import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; /** * Abstraction over things that have changed between different MC versions. */ public class MCVer { public static int getProtocolVersion() { - //#if MC>=11400 return SharedConstants.getVersion().getProtocolVersion(); - //#else - //$$ return RealmsSharedConstants.NETWORK_PROTOCOL_VERSION; - //#endif } public static PacketTypeRegistry getPacketTypeRegistry(boolean loginPhase) { @@ -95,7 +46,6 @@ public static PacketTypeRegistry getPacketTypeRegistry(boolean loginPhase) { } public static void resizeMainWindow(Minecraft mc, int width, int height) { - //#if MC>=11400 Framebuffer fb = mc.getFramebuffer(); if (fb.framebufferWidth != width || fb.framebufferHeight != height) { fb.resize(width, height, false); @@ -104,95 +54,34 @@ public static void resizeMainWindow(Minecraft mc, int width, int height) { MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) mc.getMainWindow(); mainWindow.setFramebufferWidth(width); mainWindow.setFramebufferHeight(height); - //#if MC>=11500 mc.gameRenderer.updateShaderGroupSize(width, height); - //#endif - //#else - //$$ if (width != mc.displayWidth || height != mc.displayHeight) { - //$$ mc.resize(width, height); - //$$ } - //#endif } - //#if MC<10800 - //$$ public static String tryReadString(PacketBuffer buffer, int max) { - //$$ try { - //$$ return buffer.readStringFromBuffer(max); - //$$ } catch (IOException e) { - //$$ throw new DecoderException(e); - //$$ } - //$$ } - //#endif - public static - //#if MC>=11400 - CompletableFuture - //#else - //$$ ListenableFuture - //#endif + public static CompletableFuture setServerResourcePack(File file) { - //#if MC>=11400 return getMinecraft().getPackFinder().setServerPack( file - //#if MC>=11600 , IPackNameDecorator.SERVER - //#endif ); - //#else - //$$ ResourcePackRepository repo = getMinecraft().getResourcePackRepository(); - //#if MC>=10800 - //$$ return repo.setServerResourcePack(file); - //#else - //$$ ResourcePackRepositoryAccessor acc = (ResourcePackRepositoryAccessor) repo; - //$$ acc.setActive(false); - //$$ acc.setPack(new FileResourcePack(file)); - //$$ Minecraft.getMinecraft().scheduleResourcesRefresh(); - //$$ return Futures.immediateFuture(null); - //#endif - //#endif } public static void addCallback( - //#if MC>=11400 CompletableFuture future, - //#else - //$$ ListenableFuture future, - //#endif Consumer success, Consumer failure ) { - //#if MC>=11400 future.thenAccept(success).exceptionally(throwable -> { failure.accept(throwable); return null; }); - //#else - //$$ Futures.addCallback(future, new FutureCallback() { - //$$ @Override - //$$ public void onSuccess(T result) { - //$$ success.accept(result); - //$$ } - //$$ - //$$ @Override - //$$ public void onFailure(Throwable throwable) { - //$$ failure.accept(throwable); - //$$ } - //$$ }); - //#endif } - //#if MC>=10800 @SuppressWarnings("unchecked") public static List getElements(VertexFormat vertexFormat) { return vertexFormat.getElements(); } - //#endif - //#if MC<10800 - //$$ public static RenderManager getRenderManager(@SuppressWarnings("unused") Minecraft mc) { - //$$ return RenderManager.instance; - //$$ } - //#endif public static Minecraft getMinecraft() { return Minecraft.getInstance(); @@ -200,71 +89,36 @@ public static Minecraft getMinecraft() { public static void addButton( Screen screen, - //#if MC>=11400 Button button - //#else - //$$ GuiButton button - //#endif ) { GuiScreenAccessor acc = (GuiScreenAccessor) screen; acc.getButtons().add(button); - //#if MC>=11400 acc.getChildren().add(button); - //#endif } - //#if MC>=11400 public static Optional findButton(List buttonList, @SuppressWarnings("unused") String text, @SuppressWarnings("unused") int id) { - //#if MC>=11600 final TranslationTextComponent message = new TranslationTextComponent(text); - //#else - //$$ final String message = I18n.translate(text); - //#endif for (Widget b : buttonList) { if (message.equals(b.getMessage())) { return Optional.of(b); } - //#if MC>=11600 // Fuzzy match (copy does not include children) if (b.getMessage() != null && b.getMessage().copyRaw().equals(message)) { return Optional.of(b); } - //#endif } return Optional.empty(); } - //#else - //$$ public static Optional findButton(List buttonList, @SuppressWarnings("unused") String text, int id) { - //$$ for (GuiButton b : buttonList) { - //$$ if (b.id == id) { - //$$ return Optional.of(b); - //$$ } - //$$ } - //$$ return Optional.empty(); - //$$ } - //#endif - //#if MC>=11400 public static void processKeyBinds() { ((MinecraftMethodAccessor) getMinecraft()).replayModProcessKeyBinds(); } - //#endif - //#if MC>=10800 && MC<11500 - //$$ public interface ChunkRenderWorkerAccessor { - //$$ void doRunTask(ChunkRenderTask task) throws InterruptedException; - //$$ } - //#endif public static long milliTime() { - //#if MC>=11400 return Util.milliTime(); - //#else - //$$ return Minecraft.getSystemTime(); - //#endif } - //#if MC>=10904 // TODO: this can be inlined once https://github.com/SpongePowered/Mixin/issues/305 is fixed public static Vector3d getPosition(Particle particle, float partialTicks) { ParticleAccessor acc = (ParticleAccessor) particle; @@ -273,56 +127,18 @@ public static Vector3d getPosition(Particle particle, float partialTicks) { double z = acc.getPrevPosZ() + (acc.getPosZ() - acc.getPrevPosZ()) * partialTicks; return new Vector3d(x, y, z); } - //#endif public static void openFile(File file) { - //#if MC>=11400 Util.getOSType().openFile(file); - //#else - //$$ String path = file.getAbsolutePath(); - //$$ - //$$ // First try OS specific methods - //$$ try { - //$$ switch (Util.getOSType()) { - //$$ case WINDOWS: - //$$ Runtime.getRuntime().exec(String.format("cmd.exe /C start \"Open file\" \"%s\"", path)); - //$$ return; - //$$ case OSX: - //$$ Runtime.getRuntime().exec(new String[]{"/usr/bin/open", path}); - //$$ return; - //$$ } - //$$ } catch (IOException e) { - //$$ LogManager.getLogger().error("Cannot open file", e); - //$$ } - //$$ - //$$ // Otherwise try to java way - //$$ try { - //$$ Desktop.getDesktop().browse(file.toURI()); - //$$ } catch (Throwable throwable) { - //$$ // And if all fails, lwjgl - //$$ Sys.openURL("file://" + path); - //$$ } - //#endif } public static void openURL(URI url) { - //#if MC>=11400 Util.getOSType().openURI(url); - //#else - //$$ try { - //$$ Desktop.getDesktop().browse(url); - //$$ } catch (Throwable e) { - //$$ LogManager.getLogger().error("Failed to open URL: ", e); - //$$ } - //#endif } - //#if MC<10900 - //$$ public static class SoundEvent {} - //#endif - //#if MC>=11400 private static Boolean hasOptifine; + public static boolean hasOptifine() { if (hasOptifine == null) { try { @@ -334,31 +150,9 @@ public static boolean hasOptifine() { } return hasOptifine; } - //#else - //$$ public static boolean hasOptifine() { - //$$ return FMLClientHandler.instance().hasOptifine(); - //$$ } - //#endif - //#if MC<=10710 - //$$ public static class GlStateManager { - //$$ public static void resetColor() { /* nop */ } - //$$ public static void clearColor(float r, float g, float b, float a) { glClearColor(r, g, b, a); } - //$$ public static void enableTexture2D() { glEnable(GL_TEXTURE_2D); } - //$$ public static void enableAlpha() { glEnable(GL_ALPHA_TEST); } - //$$ public static void alphaFunc(int func, float ref) { glAlphaFunc(func, ref); } - //$$ public static void enableDepth() { glEnable(GL_DEPTH_TEST); } - //$$ public static void pushMatrix() { glPushMatrix(); } - //$$ public static void popAttrib() { glPopAttrib(); } - //$$ public static void popMatrix() { glPopMatrix(); } - //$$ public static void clear(int mask) { glClear(mask); } - //$$ public static void translate(double x, double y, double z) { glTranslated(x, y, z); } - //$$ public static void rotate(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); } - //$$ } - //#endif public static abstract class Keyboard { - //#if MC>=11400 public static final int KEY_LCONTROL = GLFW.GLFW_KEY_LEFT_CONTROL; public static final int KEY_LSHIFT = GLFW.GLFW_KEY_LEFT_SHIFT; public static final int KEY_ESCAPE = GLFW.GLFW_KEY_ESCAPE; @@ -399,81 +193,14 @@ public static abstract class Keyboard { public static final int KEY_X = GLFW.GLFW_KEY_X; public static final int KEY_Y = GLFW.GLFW_KEY_Y; public static final int KEY_Z = GLFW.GLFW_KEY_Z; - //#else - //$$ public static final int KEY_LCONTROL = org.lwjgl.input.Keyboard.KEY_LCONTROL; - //$$ public static final int KEY_LSHIFT = org.lwjgl.input.Keyboard.KEY_LSHIFT; - //$$ public static final int KEY_ESCAPE = org.lwjgl.input.Keyboard.KEY_ESCAPE; - //$$ public static final int KEY_HOME = org.lwjgl.input.Keyboard.KEY_HOME; - //$$ public static final int KEY_END = org.lwjgl.input.Keyboard.KEY_END; - //$$ public static final int KEY_UP = org.lwjgl.input.Keyboard.KEY_UP; - //$$ public static final int KEY_DOWN = org.lwjgl.input.Keyboard.KEY_DOWN; - //$$ public static final int KEY_LEFT = org.lwjgl.input.Keyboard.KEY_LEFT; - //$$ public static final int KEY_RIGHT = org.lwjgl.input.Keyboard.KEY_RIGHT; - //$$ public static final int KEY_BACK = org.lwjgl.input.Keyboard.KEY_BACK; - //$$ public static final int KEY_DELETE = org.lwjgl.input.Keyboard.KEY_DELETE; - //$$ public static final int KEY_RETURN = org.lwjgl.input.Keyboard.KEY_RETURN; - //$$ public static final int KEY_TAB = org.lwjgl.input.Keyboard.KEY_TAB; - //$$ public static final int KEY_F1 = org.lwjgl.input.Keyboard.KEY_F1; - //$$ public static final int KEY_A = org.lwjgl.input.Keyboard.KEY_A; - //$$ public static final int KEY_B = org.lwjgl.input.Keyboard.KEY_B; - //$$ public static final int KEY_C = org.lwjgl.input.Keyboard.KEY_C; - //$$ public static final int KEY_D = org.lwjgl.input.Keyboard.KEY_D; - //$$ public static final int KEY_E = org.lwjgl.input.Keyboard.KEY_E; - //$$ public static final int KEY_F = org.lwjgl.input.Keyboard.KEY_F; - //$$ public static final int KEY_G = org.lwjgl.input.Keyboard.KEY_G; - //$$ public static final int KEY_H = org.lwjgl.input.Keyboard.KEY_H; - //$$ public static final int KEY_I = org.lwjgl.input.Keyboard.KEY_I; - //$$ public static final int KEY_J = org.lwjgl.input.Keyboard.KEY_J; - //$$ public static final int KEY_K = org.lwjgl.input.Keyboard.KEY_K; - //$$ public static final int KEY_L = org.lwjgl.input.Keyboard.KEY_L; - //$$ public static final int KEY_M = org.lwjgl.input.Keyboard.KEY_M; - //$$ public static final int KEY_N = org.lwjgl.input.Keyboard.KEY_N; - //$$ public static final int KEY_O = org.lwjgl.input.Keyboard.KEY_O; - //$$ public static final int KEY_P = org.lwjgl.input.Keyboard.KEY_P; - //$$ public static final int KEY_Q = org.lwjgl.input.Keyboard.KEY_Q; - //$$ public static final int KEY_R = org.lwjgl.input.Keyboard.KEY_R; - //$$ public static final int KEY_S = org.lwjgl.input.Keyboard.KEY_S; - //$$ public static final int KEY_T = org.lwjgl.input.Keyboard.KEY_T; - //$$ public static final int KEY_U = org.lwjgl.input.Keyboard.KEY_U; - //$$ public static final int KEY_V = org.lwjgl.input.Keyboard.KEY_V; - //$$ public static final int KEY_W = org.lwjgl.input.Keyboard.KEY_W; - //$$ public static final int KEY_X = org.lwjgl.input.Keyboard.KEY_X; - //$$ public static final int KEY_Y = org.lwjgl.input.Keyboard.KEY_Y; - //$$ public static final int KEY_Z = org.lwjgl.input.Keyboard.KEY_Z; - //#endif public static boolean hasControlDown() { return Screen.hasControlDown(); } public static boolean isKeyDown(int keyCode) { - //#if MC>=11500 return InputMappings.isKeyDown(getMinecraft().getMainWindow().getHandle(), keyCode); - //#else - //#if MC>=11400 - //$$ return InputUtil.isKeyPressed(getMinecraft().window.getHandle(), keyCode); - //#else - //#if MC>=11400 - //$$ return InputMappings.isKeyDown(keyCode); - //#else - //$$ return org.lwjgl.input.Keyboard.isKeyDown(keyCode); - //#endif - //#endif - //#endif } - //#if MC<11400 - //$$ public static int getEventKey() { - //$$ return org.lwjgl.input.Keyboard.getEventKey(); - //$$ } - //$$ - //$$ public static boolean getEventKeyState() { - //$$ return org.lwjgl.input.Keyboard.getEventKeyState(); - //$$ } - //$$ - //$$ public static String getKeyName(int code) { - //$$ return org.lwjgl.input.Keyboard.getKeyName(code); - //$$ } - //#endif } } diff --git a/src/main/java/com/replaymod/core/versions/Patterns.java b/src/main/java/com/replaymod/core/versions/Patterns.java index ac9f6d9f..d11103b2 100644 --- a/src/main/java/com/replaymod/core/versions/Patterns.java +++ b/src/main/java/com/replaymod/core/versions/Patterns.java @@ -1,103 +1,56 @@ package com.replaymod.core.versions; import com.replaymod.gradle.remap.Pattern; +import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.audio.SimpleSound; +import net.minecraft.client.gui.widget.Widget; +import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.client.audio.SimpleSound; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.world.ClientWorld; import net.minecraft.crash.CrashReportCategory; +import net.minecraft.crash.ICrashReportDetail; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundEvent; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; -//#if MC>=11400 -import net.minecraft.client.gui.widget.Widget; -import net.minecraft.client.MainWindow; -//#else -//$$ import net.minecraft.client.gui.GuiButton; -//#endif - -//#if MC>=10904 -import net.minecraft.util.SoundEvent; -import net.minecraft.crash.ICrashReportDetail; -//#else -//$$ import java.util.concurrent.Callable; -//#endif - -//#if MC>=10809 -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -//#else -//#endif - -//#if MC>=10800 -import net.minecraft.client.renderer.BufferBuilder; -//#else -//$$ import net.minecraft.entity.EntityLivingBase; -//#endif - import java.util.Collection; import java.util.List; class Patterns { - //#if MC>=10904 @Pattern private static void addCrashCallable(CrashReportCategory category, String name, ICrashReportDetail callable) { - //#if MC>=11200 category.addDetail(name, callable); - //#else - //$$ category.setDetail(name, callable); - //#endif } - //#else - //$$ @Pattern - //$$ private static void addCrashCallable(CrashReportCategory category, String name, Callable callable) { - //$$ category.addCrashSectionCallable(name, callable); - //$$ } - //#endif @Pattern private static double Entity_getX(Entity entity) { - //#if MC>=11500 return entity.getPosX(); - //#else - //$$ return entity.x; - //#endif } @Pattern private static double Entity_getY(Entity entity) { - //#if MC>=11500 return entity.getPosY(); - //#else - //$$ return entity.y; - //#endif } @Pattern private static double Entity_getZ(Entity entity) { - //#if MC>=11500 return entity.getPosZ(); - //#else - //$$ return entity.z; - //#endif } @Pattern private static void Entity_setPos(Entity entity, double x, double y, double z) { - //#if MC>=11500 entity.setRawPosition(x, y, z); - //#else - //$$ { net.minecraft.entity.Entity self = entity; self.x = x; self.y = y; self.z = z; } - //#endif } - //#if MC>=11400 @Pattern private static void setWidth(Widget button, int value) { button.setWidth(value); @@ -110,276 +63,136 @@ private static int getWidth(Widget button) { @Pattern private static int getHeight(Widget button) { - //#if MC>=11600 return button.getHeight(); - //#else - //$$ return ((com.replaymod.core.mixin.AbstractButtonWidgetAccessor) button).getHeight(); - //#endif - } - //#else - //$$ @Pattern - //$$ private static void setWidth(GuiButton button, int value) { - //$$ button.width = value; - //$$ } - //$$ - //$$ @Pattern - //$$ private static int getWidth(GuiButton button) { - //$$ return button.width; - //$$ } - //$$ - //$$ @Pattern - //$$ private static int getHeight(GuiButton button) { - //$$ return button.height; - //$$ } - //#endif + } @Pattern private static String readString(PacketBuffer buffer, int max) { - //#if MC>=10800 return buffer.readString(max); - //#else - //$$ return com.replaymod.core.versions.MCVer.tryReadString(buffer, max); - //#endif } @Pattern - //#if MC>=10800 private static Entity getRenderViewEntity(Minecraft mc) { return mc.getRenderViewEntity(); } - //#else - //$$ private static EntityLivingBase getRenderViewEntity(Minecraft mc) { - //$$ return mc.renderViewEntity; - //$$ } - //#endif @Pattern - //#if MC>=10800 private static void setRenderViewEntity(Minecraft mc, Entity entity) { mc.setRenderViewEntity(entity); } - //#else - //$$ private static void setRenderViewEntity(Minecraft mc, EntityLivingBase entity) { - //$$ mc.renderViewEntity = entity; - //$$ } - //#endif @Pattern private static Entity getVehicle(Entity passenger) { - //#if MC>=10904 return passenger.getRidingEntity(); - //#else - //$$ return passenger.ridingEntity; - //#endif } @Pattern private static Iterable loadedEntityList(ClientWorld world) { - //#if MC>=11400 return world.getAllEntities(); - //#else - //#if MC>=10809 - //$$ return world.loadedEntityList; - //#else - //$$ return ((java.util.List) world.loadedEntityList); - //#endif - //#endif } @Pattern private static Collection[] getEntitySectionArray(Chunk chunk) { - //#if MC>=10800 return chunk.getEntityLists(); - //#else - //$$ return chunk.entityLists; - //#endif } @Pattern private static List playerEntities(World world) { - //#if MC>=11400 return world.getPlayers(); - //#elseif MC>=10809 - //$$ return world.playerEntities; - //#else - //$$ return ((List) world.playerEntities); - //#endif } @Pattern private static boolean isOnMainThread(Minecraft mc) { - //#if MC>=11400 return mc.isOnExecutionThread(); - //#else - //$$ return mc.isCallingFromMinecraftThread(); - //#endif } @Pattern private static void scheduleOnMainThread(Minecraft mc, Runnable runnable) { - //#if MC>=11400 mc.enqueue(runnable); - //#else - //$$ mc.addScheduledTask(runnable); - //#endif } @Pattern private static MainWindow getWindow(Minecraft mc) { - //#if MC>=11500 return mc.getMainWindow(); - //#elseif MC>=11400 - //$$ return mc.window; - //#else - //$$ return new com.replaymod.core.versions.Window(mc); - //#endif } @Pattern private static BufferBuilder Tessellator_getBuffer(Tessellator tessellator) { - //#if MC>=10800 return tessellator.getBuffer(); - //#else - //$$ return new BufferBuilder(tessellator); - //#endif } @Pattern private static void BufferBuilder_beginPosCol(BufferBuilder buffer, int mode) { - //#if MC>=10809 buffer.begin(mode, DefaultVertexFormats.POSITION_COLOR); - //#else - //$$ buffer.startDrawing(mode /* POSITION_COLOR */); - //#endif } @Pattern private static void BufferBuilder_addPosCol(BufferBuilder buffer, double x, double y, double z, int r, int g, int b, int a) { - //#if MC>=10809 buffer.pos(x, y, z).color(r, g, b, a).endVertex(); - //#else - //$$ { WorldRenderer $buffer = buffer; double $x = x; double $y = y; double $z = z; $buffer.setColorRGBA(r, g, b, a); $buffer.addVertex($x, $y, $z); } - //#endif } @Pattern private static void BufferBuilder_beginPosTex(BufferBuilder buffer, int mode) { - //#if MC>=10809 buffer.begin(mode, DefaultVertexFormats.POSITION_TEX); - //#else - //$$ buffer.startDrawing(mode /* POSITION_TEXTURE */); - //#endif } @Pattern private static void BufferBuilder_addPosTex(BufferBuilder buffer, double x, double y, double z, float u, float v) { - //#if MC>=10809 buffer.pos(x, y, z).tex(u, v).endVertex(); - //#else - //$$ buffer.addVertexWithUV(x, y, z, u, v); - //#endif } @Pattern private static void BufferBuilder_beginPosTexCol(BufferBuilder buffer, int mode) { - //#if MC>=10809 buffer.begin(mode, DefaultVertexFormats.POSITION_TEX_COLOR); - //#else - //$$ buffer.startDrawing(mode /* POSITION_TEXTURE_COLOR */); - //#endif } @Pattern private static void BufferBuilder_addPosTexCol(BufferBuilder buffer, double x, double y, double z, float u, float v, int r, int g, int b, int a) { - //#if MC>=10809 buffer.pos(x, y, z).tex(u, v).color(r, g, b, a).endVertex(); - //#else - //$$ { WorldRenderer $buffer = buffer; double $x = x; double $y = y; double $z = z; float $u = u; float $v = v; $buffer.setColorRGBA(r, g, b, a); $buffer.addVertexWithUV($x, $y, $z, $u, $v); } - //#endif } @Pattern private static Tessellator Tessellator_getInstance() { - //#if MC>=10800 return Tessellator.getInstance(); - //#else - //$$ return Tessellator.instance; - //#endif } @Pattern private static EntityRendererManager getEntityRenderDispatcher(Minecraft mc) { - //#if MC>=10800 return mc.getRenderManager(); - //#else - //$$ return com.replaymod.core.versions.MCVer.getRenderManager(mc); - //#endif } @Pattern private static float getCameraYaw(EntityRendererManager dispatcher) { - //#if MC>=11500 return dispatcher.info.getYaw(); - //#else - //$$ return dispatcher.cameraYaw; - //#endif } @Pattern private static float getCameraPitch(EntityRendererManager dispatcher) { - //#if MC>=11500 return dispatcher.info.getPitch(); - //#else - //$$ return dispatcher.cameraPitch; - //#endif } @Pattern private static float getRenderPartialTicks(Minecraft mc) { - //#if MC>=10900 return mc.getRenderPartialTicks(); - //#else - //$$ return ((com.replaymod.core.mixin.MinecraftAccessor) mc).getTimer().renderPartialTicks; - //#endif } @Pattern private static TextureManager getTextureManager(Minecraft mc) { - //#if MC>=11400 return mc.getTextureManager(); - //#else - //$$ return mc.renderEngine; - //#endif } @Pattern private static String getBoundKeyName(KeyBinding keyBinding) { - //#if MC>=11600 return keyBinding.func_238171_j_().getString(); - //#elseif MC>=11400 - //$$ return keyBinding.getLocalizedName(); - //#else - //$$ return org.lwjgl.input.Keyboard.getKeyName(keyBinding.getKeyCode()); - //#endif } @Pattern private static SimpleSound master(ResourceLocation sound, float pitch) { - //#if MC>=10900 return SimpleSound.master(new SoundEvent(sound), pitch); - //#elseif MC>=10800 - //$$ return PositionedSoundRecord.create(sound, pitch); - //#else - //$$ return PositionedSoundRecord.createPositionedSoundRecord(sound, pitch); - //#endif } @Pattern private static boolean isKeyBindingConflicting(KeyBinding a, KeyBinding b) { - //#if MC>=10900 return a.conflicts(b); - //#else - //$$ return (a.getKeyCode() == b.getKeyCode()); - //#endif } } diff --git a/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java b/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java index b2b495d5..e437fef1 100644 --- a/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java +++ b/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java @@ -9,7 +9,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -public class SchedulerImpl implements Scheduler { +public class SchedulerImpl implements Scheduler { private static final Minecraft mc = Minecraft.getInstance(); @Override @@ -46,6 +46,7 @@ public void run() { */ private boolean inRunLater = false; private boolean inRenderTaskQueue = false; + // Starting 1.14 MC clears the queue of scheduled tasks on disconnect. // This works fine for MC since it uses the queue only for packet handling but breaks our assumption that // stuff submitted via runLater is actually always run (e.g. recording might not be fully stopped because parts @@ -78,6 +79,7 @@ public void drainTasks() { super.drainTasks(); } } + public final ReplayModExecutor executor = new ReplayModExecutor("Client/ReplayMod"); @Override diff --git a/src/main/java/com/replaymod/editor/ReplayModEditor.java b/src/main/java/com/replaymod/editor/ReplayModEditor.java index bee459b5..cc3fb333 100644 --- a/src/main/java/com/replaymod/editor/ReplayModEditor.java +++ b/src/main/java/com/replaymod/editor/ReplayModEditor.java @@ -7,7 +7,10 @@ import org.apache.logging.log4j.Logger; public class ReplayModEditor implements Module { - { instance = this; } + { + instance = this; + } + public static ReplayModEditor instance; private ReplayMod core; diff --git a/src/main/java/com/replaymod/editor/gui/GuiEditReplay.java b/src/main/java/com/replaymod/editor/gui/GuiEditReplay.java index 578c1cd2..13bca602 100644 --- a/src/main/java/com/replaymod/editor/gui/GuiEditReplay.java +++ b/src/main/java/com/replaymod/editor/gui/GuiEditReplay.java @@ -3,9 +3,6 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.utils.Utils; import com.replaymod.editor.ReplayModEditor; -import com.replaymod.replay.gui.overlay.GuiMarkerTimeline; -import com.replaymod.replaystudio.data.Marker; -import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.container.GuiPanel; @@ -18,6 +15,9 @@ import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.layout.VerticalLayout; import com.replaymod.gui.popup.AbstractGuiPopup; +import com.replaymod.replay.gui.overlay.GuiMarkerTimeline; +import com.replaymod.replaystudio.data.Marker; +import com.replaymod.replaystudio.replay.ReplayFile; import de.johni0702.minecraft.gui.utils.lwjgl.Color; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import net.minecraft.crash.CrashReport; diff --git a/src/main/java/com/replaymod/editor/gui/MarkerProcessor.java b/src/main/java/com/replaymod/editor/gui/MarkerProcessor.java index 80e6494d..0edf67db 100644 --- a/src/main/java/com/replaymod/editor/gui/MarkerProcessor.java +++ b/src/main/java/com/replaymod/editor/gui/MarkerProcessor.java @@ -21,14 +21,7 @@ import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -58,11 +51,17 @@ public static boolean producesAnyOutput(ReplayFile replayFile) throws IOExceptio } private enum OutputState { - /** A new output file has begun but not data has been written yet. */ + /** + * A new output file has begun but not data has been written yet. + */ NotYetWriting, - /** Currently writing data to the active output file. */ + /** + * Currently writing data to the active output file. + */ Writing, - /** Currently not writing data. */ + /** + * Currently not writing data. + */ Paused, } diff --git a/src/main/java/com/replaymod/editor/handler/GuiHandler.java b/src/main/java/com/replaymod/editor/handler/GuiHandler.java index f9a88ce4..3fa0e601 100644 --- a/src/main/java/com/replaymod/editor/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/editor/handler/GuiHandler.java @@ -3,18 +3,21 @@ import com.replaymod.core.utils.Utils; import com.replaymod.editor.ReplayModEditor; import com.replaymod.editor.gui.GuiEditReplay; -import com.replaymod.replay.gui.screen.GuiReplayViewer; import com.replaymod.gui.container.AbstractGuiScreen; import com.replaymod.gui.container.GuiScreen; import com.replaymod.gui.element.GuiButton; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.InitScreenCallback; +import com.replaymod.replay.gui.screen.GuiReplayViewer; import net.minecraft.crash.CrashReport; import java.io.IOException; public class GuiHandler extends EventRegistrations { - { on(InitScreenCallback.EVENT, (vanillaGuiScreen, buttonList) -> injectIntoReplayViewer(vanillaGuiScreen)); } + { + on(InitScreenCallback.EVENT, (vanillaGuiScreen, buttonList) -> injectIntoReplayViewer(vanillaGuiScreen)); + } + public void injectIntoReplayViewer(net.minecraft.client.gui.screen.Screen vanillaGuiScreen) { AbstractGuiScreen guiScreen = GuiScreen.from(vanillaGuiScreen); if (!(guiScreen instanceof GuiReplayViewer)) { @@ -24,7 +27,8 @@ public void injectIntoReplayViewer(net.minecraft.client.gui.screen.Screen vanill // Inject Edit button if (!replayViewer.editorButton.getChildren().isEmpty()) return; replayViewer.replaySpecificButtons.add(new GuiButton(replayViewer.editorButton).onClick(() -> { - if (Utils.ifMinimalModeDoPopup(replayViewer, () -> {})) return; + if (Utils.ifMinimalModeDoPopup(replayViewer, () -> { + })) return; try { new GuiEditReplay(replayViewer, replayViewer.list.getSelected().get(0).file.toPath()) { @Override @@ -34,7 +38,8 @@ protected void close() { } }.open(); } catch (IOException e) { - Utils.error(ReplayModEditor.LOGGER, replayViewer, CrashReport.makeCrashReport(e, "Opening replay editor"), () -> {}); + Utils.error(ReplayModEditor.LOGGER, replayViewer, CrashReport.makeCrashReport(e, "Opening replay editor"), () -> { + }); } }).setSize(73, 20).setI18nLabel("replaymod.gui.edit").setDisabled()); } diff --git a/src/main/java/com/replaymod/extras/FullBrightness.java b/src/main/java/com/replaymod/extras/FullBrightness.java index b8bdd886..3615f5fe 100644 --- a/src/main/java/com/replaymod/extras/FullBrightness.java +++ b/src/main/java/com/replaymod/extras/FullBrightness.java @@ -4,14 +4,14 @@ import com.replaymod.core.events.PostRenderCallback; import com.replaymod.core.events.PreRenderCallback; import com.replaymod.core.versions.MCVer.Keyboard; -import com.replaymod.replay.ReplayHandler; -import com.replaymod.replay.ReplayModReplay; -import com.replaymod.replay.events.ReplayOpenedCallback; -import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import com.replaymod.gui.element.GuiImage; import com.replaymod.gui.element.IGuiImage; import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.replay.ReplayHandler; +import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replay.events.ReplayOpenedCallback; +import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import net.minecraft.client.Minecraft; import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Effects; @@ -23,11 +23,7 @@ public class FullBrightness extends EventRegistrations implements Extra { private Minecraft mc; private boolean active; - //#if MC>=11400 private double originalGamma; - //#else - //$$ private float originalGamma; - //#endif @Override public void register(final ReplayMod mod) throws Exception { @@ -41,11 +37,7 @@ public void register(final ReplayMod mod) throws Exception { public void run() { active = !active; // need to tick once to update lightmap when replay is paused - //#if MC>=11400 mod.getMinecraft().gameRenderer.tick(); - //#else - //$$ mod.getMinecraft().entityRenderer.updateRenderer(); - //#endif ReplayHandler replayHandler = module.getReplayHandler(); if (replayHandler != null) { updateIndicator(replayHandler.getOverlay()); @@ -66,7 +58,10 @@ public Type getType() { return Type.Gamma; } - { on(PreRenderCallback.EVENT, this::preRender); } + { + on(PreRenderCallback.EVENT, this::preRender); + } + private void preRender() { if (active && module.getReplayHandler() != null) { Type type = getType(); @@ -77,16 +72,16 @@ private void preRender() { if (type == Type.NightVision || type == Type.Both) { if (mc.player != null) { mc.player.addPotionEffect(new EffectInstance(Effects.NIGHT_VISION - //#if MC<=10809 - //$$ .id - //#endif , Integer.MAX_VALUE)); } } } } - { on(PostRenderCallback.EVENT, this::postRender); } + { + on(PostRenderCallback.EVENT, this::postRender); + } + private void postRender() { if (active && module.getReplayHandler() != null) { Type type = getType(); @@ -96,16 +91,16 @@ private void postRender() { if (type == Type.NightVision || type == Type.Both) { if (mc.player != null) { mc.player.removePotionEffect(Effects.NIGHT_VISION - //#if MC<=10809 - //$$ .id - //#endif ); } } } } - { on(ReplayOpenedCallback.EVENT, replayHandler -> updateIndicator(replayHandler.getOverlay())); } + { + on(ReplayOpenedCallback.EVENT, replayHandler -> updateIndicator(replayHandler.getOverlay())); + } + private void updateIndicator(GuiReplayOverlay overlay) { if (active) { overlay.statusIndicatorPanel.addElements(new HorizontalLayout.Data(1), indicator); diff --git a/src/main/java/com/replaymod/extras/HotkeyButtons.java b/src/main/java/com/replaymod/extras/HotkeyButtons.java index ae4d7997..8d4c57ad 100644 --- a/src/main/java/com/replaymod/extras/HotkeyButtons.java +++ b/src/main/java/com/replaymod/extras/HotkeyButtons.java @@ -2,8 +2,6 @@ import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.ReplayMod; -import com.replaymod.replay.events.ReplayOpenedCallback; -import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiPanel; @@ -15,6 +13,8 @@ import com.replaymod.gui.layout.GridLayout; import com.replaymod.gui.layout.LayoutData; import com.replaymod.gui.utils.EventRegistrations; +import com.replaymod.replay.events.ReplayOpenedCallback; +import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.resources.I18n; @@ -34,7 +34,10 @@ public void register(ReplayMod mod) { register(); } - { on(ReplayOpenedCallback.EVENT, replayHandler -> new Gui(mod, replayHandler.getOverlay())); } + { + on(ReplayOpenedCallback.EVENT, replayHandler -> new Gui(mod, replayHandler.getOverlay())); + } + public static final class Gui { private final GuiButton toggleButton; private final GridLayout panelLayout; @@ -68,49 +71,49 @@ public Map getElements() { keyBindingRegistry.getBindings().values().stream() .sorted(Comparator.comparing(it -> I18n.format(it.name))) .forEachOrdered(keyBinding -> { - GuiButton button = new GuiButton(){ - @Override - public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { - // There doesn't seem to be an KeyBindingUpdate event, so we'll just update it every time - setLabel(keyBinding.isBound() ? keyBinding.getBoundKey() : ""); - - if (keyBinding.supportsAutoActivation()) { - setTooltip(new GuiTooltip().setText(new String[]{ - I18n.format("replaymod.gui.ingame.autoactivating"), - I18n.format("replaymod.gui.ingame.autoactivating." - + (keyBinding.isAutoActivating() ? "disable" : "enable")), - })); - setLabelColor(keyBinding.isAutoActivating() ? 0x00ff00 : 0xe0e0e0); - } - - super.draw(renderer, size, renderInfo); - } - }.onClick(() -> { - if (keyBinding.supportsAutoActivation() && Screen.hasControlDown()) { - keyBinding.setAutoActivating(!keyBinding.isAutoActivating()); - } else { - keyBinding.trigger(); - } - }); - GuiLabel label = new GuiLabel().setI18nText(keyBinding.name); - panel.addElements(null, new GuiPanel().setLayout(new CustomLayout() { - @Override - protected void layout(GuiPanel container, int width, int height) { - width(button, Math.max(10 /* consistent min width */, width(button)) + 10 /* padding */); - height(button, 20); - - int textWidth = width(label); - - x(label, width(button) + 4); - width(label, width - x(label)); - - if (textWidth > width - x(label)) { - height(label, height(label) * 2); // split over two lines - } - y(label, (height - height(label)) / 2); - } - }).addElements(null, button, label).setSize(150, 20)); - }); + GuiButton button = new GuiButton() { + @Override + public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { + // There doesn't seem to be an KeyBindingUpdate event, so we'll just update it every time + setLabel(keyBinding.isBound() ? keyBinding.getBoundKey() : ""); + + if (keyBinding.supportsAutoActivation()) { + setTooltip(new GuiTooltip().setText(new String[]{ + I18n.format("replaymod.gui.ingame.autoactivating"), + I18n.format("replaymod.gui.ingame.autoactivating." + + (keyBinding.isAutoActivating() ? "disable" : "enable")), + })); + setLabelColor(keyBinding.isAutoActivating() ? 0x00ff00 : 0xe0e0e0); + } + + super.draw(renderer, size, renderInfo); + } + }.onClick(() -> { + if (keyBinding.supportsAutoActivation() && Screen.hasControlDown()) { + keyBinding.setAutoActivating(!keyBinding.isAutoActivating()); + } else { + keyBinding.trigger(); + } + }); + GuiLabel label = new GuiLabel().setI18nText(keyBinding.name); + panel.addElements(null, new GuiPanel().setLayout(new CustomLayout() { + @Override + protected void layout(GuiPanel container, int width, int height) { + width(button, Math.max(10 /* consistent min width */, width(button)) + 10 /* padding */); + height(button, 20); + + int textWidth = width(label); + + x(label, width(button) + 4); + width(label, width - x(label)); + + if (textWidth > width - x(label)) { + height(label, height(label) * 2); // split over two lines + } + y(label, (height - height(label)) / 2); + } + }).addElements(null, button, label).setSize(150, 20)); + }); overlay.setLayout(new CustomLayout(overlay.getLayout()) { @Override diff --git a/src/main/java/com/replaymod/extras/QuickMode.java b/src/main/java/com/replaymod/extras/QuickMode.java index 10a3f6bb..e54a5c55 100644 --- a/src/main/java/com/replaymod/extras/QuickMode.java +++ b/src/main/java/com/replaymod/extras/QuickMode.java @@ -2,13 +2,13 @@ import com.replaymod.core.ReplayMod; import com.replaymod.core.versions.MCVer.Keyboard; +import com.replaymod.gui.element.GuiImage; +import com.replaymod.gui.layout.HorizontalLayout; +import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.events.ReplayOpenedCallback; import com.replaymod.replay.gui.overlay.GuiReplayOverlay; -import com.replaymod.gui.element.GuiImage; -import com.replaymod.gui.layout.HorizontalLayout; -import com.replaymod.gui.utils.EventRegistrations; public class QuickMode extends EventRegistrations implements Extra { private ReplayModReplay module; diff --git a/src/main/java/com/replaymod/extras/ReplayModExtras.java b/src/main/java/com/replaymod/extras/ReplayModExtras.java index add19778..4c6bd845 100644 --- a/src/main/java/com/replaymod/extras/ReplayModExtras.java +++ b/src/main/java/com/replaymod/extras/ReplayModExtras.java @@ -8,14 +8,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; public class ReplayModExtras implements Module { - { instance = this; } + { + instance = this; + } + public static ReplayModExtras instance; private static final List> builtin = Arrays.asList( diff --git a/src/main/java/com/replaymod/extras/Setting.java b/src/main/java/com/replaymod/extras/Setting.java index 278ff94f..ec7fd7ac 100644 --- a/src/main/java/com/replaymod/extras/Setting.java +++ b/src/main/java/com/replaymod/extras/Setting.java @@ -13,6 +13,7 @@ public final class Setting { public static final SettingsRegistry.MultipleChoiceSettingKeys FULL_BRIGHTNESS = new SettingsRegistry.MultipleChoiceSettingKeys<>( "advanced", "fullBrightness", "replaymod.gui.settings.fullbrightness", FullBrightness.Type.Gamma.toString()); + static { FULL_BRIGHTNESS.setChoices(Arrays.stream(FullBrightness.Type.values()).map(Object::toString).collect(Collectors.toList())); } diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java index 70aca0d2..9b42709a 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/AdvancedScreenshots.java @@ -12,7 +12,12 @@ public void register(ReplayMod mod) { this.mod = mod; } - private static AdvancedScreenshots instance; { instance = this; } + private static AdvancedScreenshots instance; + + { + instance = this; + } + public static void take() { if (instance != null) { instance.takeScreenshot(); diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java index 5cef3c33..5d998e17 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiCreateScreenshot.java @@ -1,15 +1,15 @@ package com.replaymod.extras.advancedscreenshots; import com.replaymod.core.ReplayMod; -import com.replaymod.render.RenderSettings; -import com.replaymod.render.gui.GuiRenderSettings; -import com.replaymod.replay.ReplayModReplay; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.element.GuiLabel; import com.replaymod.gui.function.Loadable; import com.replaymod.gui.layout.GridLayout; import com.replaymod.gui.layout.VerticalLayout; +import com.replaymod.render.RenderSettings; +import com.replaymod.render.gui.GuiRenderSettings; +import com.replaymod.replay.ReplayModReplay; import net.minecraft.crash.CrashReport; import java.io.File; @@ -63,7 +63,8 @@ public GuiCreateScreenshot(ReplayMod mod) { } } catch (Throwable t) { - error(LOGGER, GuiCreateScreenshot.this, CrashReport.makeCrashReport(t, "Rendering video"), () -> {}); + error(LOGGER, GuiCreateScreenshot.this, CrashReport.makeCrashReport(t, "Rendering video"), () -> { + }); getScreen().display(); // Re-show the render settings gui and the new error popup } }); diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java index 67938411..77680aa1 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/GuiUploadScreenshot.java @@ -4,7 +4,6 @@ import com.replaymod.core.SettingsRegistry; import com.replaymod.core.versions.MCVer; import com.replaymod.extras.Setting; -import com.replaymod.render.RenderSettings; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.element.GuiButton; @@ -13,6 +12,7 @@ import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.layout.VerticalLayout; import com.replaymod.gui.popup.AbstractGuiPopup; +import com.replaymod.render.RenderSettings; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import java.net.URI; diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java index fac552fc..85a52591 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotRenderer.java @@ -8,8 +8,8 @@ import com.replaymod.render.rendering.Pipelines; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.Minecraft; import net.minecraft.client.MainWindow; +import net.minecraft.client.Minecraft; import net.minecraft.crash.CrashReport; import static com.replaymod.core.versions.MCVer.resizeMainWindow; diff --git a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java index 612e02cf..ee5bb4af 100644 --- a/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java +++ b/src/main/java/com/replaymod/extras/advancedscreenshots/ScreenshotWriter.java @@ -4,12 +4,12 @@ import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; import com.replaymod.extras.ReplayModExtras; +import com.replaymod.gui.versions.Image; import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.rendering.Channel; import com.replaymod.render.rendering.FrameConsumer; import com.replaymod.replay.ReplayModReplay; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import com.replaymod.gui.versions.Image; import net.minecraft.crash.CrashReport; import java.io.File; diff --git a/src/main/java/com/replaymod/extras/modcore/ModCoreInstaller.java b/src/main/java/com/replaymod/extras/modcore/ModCoreInstaller.java index a8a0fa99..d23e337f 100644 --- a/src/main/java/com/replaymod/extras/modcore/ModCoreInstaller.java +++ b/src/main/java/com/replaymod/extras/modcore/ModCoreInstaller.java @@ -32,13 +32,8 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; -import javax.swing.JFrame; -import javax.swing.JProgressBar; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.GridLayout; -import java.awt.TextArea; -import java.awt.Toolkit; +import javax.swing.*; +import java.awt.*; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -51,16 +46,6 @@ import java.util.ArrayList; import java.util.List; -//#if FABRIC>=1 -//$$ import net.fabricmc.loader.api.FabricLoader; -//#else -//#if MC>=11400 -//#else -//$$ import net.minecraft.launchwrapper.Launch; -//$$ import java.net.URLClassLoader; -//$$ import java.util.LinkedHashSet; -//#endif -//#endif public class ModCoreInstaller { @@ -73,11 +58,6 @@ public class ModCoreInstaller { private static boolean isInitalized() { try { - //#if MC<11400 - //$$ LinkedHashSet objects = new LinkedHashSet<>(); - //$$ objects.add(className); - //$$ Launch.classLoader.clearNegativeEntries(objects); - //#endif return Class.forName(className) != null; } catch (ClassNotFoundException ignored) { } @@ -169,12 +149,7 @@ public static void addToClasspath(File file) { try { URL url = file.toURI().toURL(); ClassLoader classLoader = ModCoreInstaller.class.getClassLoader(); - //#if MC>=11400 Method method = classLoader.getClass().getDeclaredMethod("addURL", URL.class); - //#else - //$$ Launch.classLoader.addURL(url); - //$$ Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); - //#endif method.setAccessible(true); method.invoke(classLoader, url); } catch (Exception e) { diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java index d0cb80fb..94e0791e 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverview.java @@ -5,33 +5,20 @@ import com.replaymod.core.events.PreRenderHandCallback; import com.replaymod.core.utils.Utils; import com.replaymod.extras.Extra; +import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.events.ReplayClosedCallback; import com.replaymod.replay.events.ReplayOpenedCallback; -import com.replaymod.gui.utils.EventRegistrations; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; -//#if MC>=11400 -import java.util.stream.Collectors; -//#else -//$$ import org.lwjgl.input.Keyboard; -//#if MC>=10800 -//$$ import com.google.common.base.Predicate; -//#else -//$$ import cpw.mods.fml.common.eventhandler.EventPriority; -//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; -//$$ import net.minecraftforge.client.event.RenderPlayerEvent; -//$$ import java.util.stream.Collectors; -//#endif -//#endif - import java.io.IOException; import java.util.*; +import java.util.stream.Collectors; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.Keyboard; public class PlayerOverview extends EventRegistrations implements Extra { private ReplayModReplay module; @@ -47,28 +34,11 @@ public void register(final ReplayMod mod) throws Exception { @Override public void run() { if (module.getReplayHandler() != null) { - //#if MC>=11400 List players = mod.getMinecraft().world.getPlayers() .stream() .map(it -> (PlayerEntity) it) .filter(it -> !(it instanceof CameraEntity)) .collect(Collectors.toList()); - //#else - //$$ @SuppressWarnings("unchecked") - //#if MC>=10800 - //$$ List players = mod.getMinecraft().world.getPlayers(EntityPlayer.class, new Predicate() { - //$$ @Override - //$$ public boolean apply(Object input) { - //$$ return !(input instanceof CameraEntity); // Exclude the camera entity - //$$ } - //$$ }); - //#else - //$$ List players = mod.getMinecraft().theWorld.playerEntities; - //$$ players = players.stream() - //$$ .filter(it -> !(it instanceof CameraEntity)) // Exclude the camera entity - //$$ .collect(Collectors.toList()); - //#endif - //#endif if (!Utils.isCtrlDown()) { // Hide all players that have an UUID v2 (commonly used for NPCs) Iterator iter = players.iterator(); @@ -99,7 +69,10 @@ public void setHidden(UUID uuid, boolean hidden) { } } - { on(ReplayOpenedCallback.EVENT, this::onReplayOpen); } + { + on(ReplayOpenedCallback.EVENT, this::onReplayOpen); + } + private void onReplayOpen(ReplayHandler replayHandler) throws IOException { Optional> savedData = replayHandler.getReplayFile().getInvisiblePlayers(); if (savedData.isPresent()) { @@ -110,26 +83,24 @@ private void onReplayOpen(ReplayHandler replayHandler) throws IOException { } } - { on(ReplayClosedCallback.EVENT, this::onReplayClose); } + { + on(ReplayClosedCallback.EVENT, this::onReplayClose); + } + private void onReplayClose(ReplayHandler replayHandler) { hiddenPlayers.clear(); } - { on(PreRenderHandCallback.EVENT, this::shouldHideHand); } + { + on(PreRenderHandCallback.EVENT, this::shouldHideHand); + } + private boolean shouldHideHand() { Entity view = module.getCore().getMinecraft().getRenderViewEntity(); return view != null && isHidden(view.getUniqueID()); } // See MixinRender for why this is 1.7.10 only - //#if MC<=10710 - //$$ @SubscribeEvent(priority = EventPriority.HIGHEST) - //$$ public void preRenderPlayer(RenderPlayerEvent.Pre event) { - //$$ if (isHidden(event.entityPlayer.getUniqueID())) { - //$$ event.setCanceled(true); - //$$ } - //$$ } - //#endif public boolean isSavingEnabled() { return savingEnabled; diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java index a5198ad7..7b193120 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java @@ -1,37 +1,21 @@ package com.replaymod.extras.playeroverview; import com.replaymod.core.utils.Utils; -import com.replaymod.replay.ReplayModReplay; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; -import com.replaymod.gui.container.GuiClickable; -import com.replaymod.gui.container.GuiContainer; -import com.replaymod.gui.container.GuiPanel; -import com.replaymod.gui.container.GuiScreen; -import com.replaymod.gui.container.GuiVerticalList; -import com.replaymod.gui.element.GuiCheckbox; -import com.replaymod.gui.element.GuiImage; -import com.replaymod.gui.element.GuiLabel; -import com.replaymod.gui.element.GuiTooltip; -import com.replaymod.gui.element.IGuiCheckbox; +import com.replaymod.gui.container.*; +import com.replaymod.gui.element.*; import com.replaymod.gui.function.Closeable; import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.HorizontalLayout; import com.replaymod.gui.utils.Colors; +import com.replaymod.replay.ReplayModReplay; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.ResourceLocation; - -//#if MC>=10904 -import net.minecraft.potion.Effects; -//#else -//$$ import net.minecraft.potion.Potion; -//#endif - -//#if MC>=10800 import net.minecraft.entity.player.PlayerModelPart; -//#endif +import net.minecraft.potion.Effects; +import net.minecraft.util.ResourceLocation; import java.util.Collections; import java.util.Comparator; @@ -50,13 +34,13 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { public final GuiCheckbox saveCheckbox = new GuiCheckbox(contentPanel) .setTooltip(new GuiTooltip().setI18nText("replaymod.gui.playeroverview.remembersettings.description")) .setI18nLabel("replaymod.gui.playeroverview.remembersettings"); - public final GuiCheckbox checkAll = new GuiCheckbox(contentPanel){ + public final GuiCheckbox checkAll = new GuiCheckbox(contentPanel) { @Override public void onClick() { playersScrollable.invokeAll(IGuiCheckbox.class, e -> e.setChecked(true)); } }.setLabel("").setChecked(true).setTooltip(new GuiTooltip().setI18nText("replaymod.gui.playeroverview.showall")); - public final GuiCheckbox uncheckAll = new GuiCheckbox(contentPanel){ + public final GuiCheckbox uncheckAll = new GuiCheckbox(contentPanel) { @Override public void onClick() { playersScrollable.invokeAll(IGuiCheckbox.class, e -> e.setChecked(false)); @@ -101,29 +85,13 @@ public PlayerOverviewGui(final PlayerOverview extra, List players) 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 MC>=10809 if (p.isWearing(PlayerModelPart.HAT)) { - //#else - //#if MC>=10800 - //$$ if (p.func_175148_a(EnumPlayerModelParts.HAT)) { - //#else - //$$ { - //#endif - //#endif renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64); } } }.setSize(16, 16), new GuiLabel().setText( - //#if MC>=11400 p.getName().getUnformattedComponentText() - //#else - //#if MC>=10800 - //$$ p.getName() - //#else - //$$ p.getDisplayName() - //#endif - //#endif ).setColor(isSpectator(p) ? Colors.DKGREY : Colors.WHITE) ).onClick(new Runnable() { @Override @@ -168,11 +136,7 @@ public void close() { } private static boolean isSpectator(PlayerEntity e) { - //#if MC>=10904 return e.isInvisible() && e.getActivePotionEffect(Effects.INVISIBILITY) == null; - //#else - //$$ return e.isInvisible() && e.getActivePotionEffect(Potion.invisibility) == null; - //#endif } private static final class PlayerComparator implements Comparator { @@ -180,15 +144,7 @@ private static final class PlayerComparator implements Comparator public int compare(PlayerEntity o1, PlayerEntity o2) { if (isSpectator(o1) && !isSpectator(o2)) return 1; if (isSpectator(o2) && !isSpectator(o1)) return -1; - //#if MC>=11400 return o1.getName().getUnformattedComponentText().compareToIgnoreCase(o2.getName().getUnformattedComponentText()); - //#else - //#if MC>=10800 - //$$ return o1.getName().compareToIgnoreCase(o2.getName()); - //#else - //$$ return o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName()); - //#endif - //#endif } } } diff --git a/src/main/java/com/replaymod/extras/youtube/GuiYoutubeUpload.java b/src/main/java/com/replaymod/extras/youtube/GuiYoutubeUpload.java index 710bea47..d4be9ce1 100644 --- a/src/main/java/com/replaymod/extras/youtube/GuiYoutubeUpload.java +++ b/src/main/java/com/replaymod/extras/youtube/GuiYoutubeUpload.java @@ -7,29 +7,24 @@ import com.google.common.util.concurrent.ListenableFuture; import com.replaymod.core.utils.Utils; import com.replaymod.core.versions.MCVer; -import com.replaymod.gui.element.GuiTextField; -import com.replaymod.render.RenderSettings; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.container.GuiScreen; +import com.replaymod.gui.element.GuiTextField; import com.replaymod.gui.element.advanced.GuiDropdownMenu; import com.replaymod.gui.element.advanced.GuiProgressBar; import com.replaymod.gui.element.advanced.GuiTextArea; import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.VerticalLayout; import com.replaymod.gui.popup.GuiFileChooserPopup; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import com.replaymod.gui.versions.Image; +import com.replaymod.render.RenderSettings; +import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import joptsimple.internal.Strings; import net.minecraft.client.resources.I18n; import org.apache.commons.io.IOUtils; -//#if MC>=11400 -//#else -//$$ import org.lwjgl.Sys; -//#endif - import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; @@ -79,6 +74,7 @@ public void run() { public final GuiTextArea descriptionField = new GuiTextArea().setMaxCharCount(Integer.MAX_VALUE) .setMaxTextWidth(Integer.MAX_VALUE).setMaxTextHeight(Integer.MAX_VALUE); + { descriptionField.setText(new String[]{I18n.format("replaymod.gui.videodescription")}); } @@ -188,7 +184,7 @@ private void setState(boolean uploading) { new Thread(() -> { try { upload.cancel(); - } catch(InterruptedException e) { + } catch (InterruptedException e) { e.printStackTrace(); } }).start(); @@ -212,7 +208,7 @@ public void onSuccess(Video result) { String url = "https://youtu.be/" + result.getId(); try { MCVer.openURL(new URL(url).toURI()); - } catch(Throwable throwable) { + } catch (Throwable throwable) { LOGGER.error("Failed to open video URL \"{}\":", url, throwable); } upload = null; diff --git a/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java b/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java index 68b9ba23..55df91d9 100644 --- a/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java +++ b/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java @@ -2,12 +2,12 @@ import com.replaymod.core.ReplayMod; import com.replaymod.extras.Extra; -import com.replaymod.gui.container.GuiScreen; -import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.gui.container.AbstractGuiScreen; +import com.replaymod.gui.container.GuiScreen; import com.replaymod.gui.element.GuiButton; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.versions.callbacks.InitScreenCallback; +import com.replaymod.render.gui.GuiRenderingDone; import net.minecraft.client.gui.screen.Screen; public class YoutubeUpload extends EventRegistrations implements Extra { @@ -16,7 +16,10 @@ public void register(ReplayMod mod) { register(); } - { on(InitScreenCallback.EVENT, ((screen, buttons) -> onGuiOpen(screen))); } + { + on(InitScreenCallback.EVENT, ((screen, buttons) -> onGuiOpen(screen))); + } + private void onGuiOpen(Screen vanillaGui) { AbstractGuiScreen abstractScreen = GuiScreen.from(vanillaGui); if (abstractScreen instanceof GuiRenderingDone) { @@ -33,5 +36,6 @@ private void onGuiOpen(Screen vanillaGui) { } } - private static class YoutubeButton extends GuiButton {} + private static class YoutubeButton extends GuiButton { + } } diff --git a/src/main/java/com/replaymod/extras/youtube/YoutubeUploader.java b/src/main/java/com/replaymod/extras/youtube/YoutubeUploader.java index 3309aa1a..264d82da 100644 --- a/src/main/java/com/replaymod/extras/youtube/YoutubeUploader.java +++ b/src/main/java/com/replaymod/extras/youtube/YoutubeUploader.java @@ -24,9 +24,9 @@ import com.google.common.io.Files; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; +import com.replaymod.gui.utils.NonNull; import com.replaymod.render.RenderSettings; import com.replaymod.render.metadata.MetadataInjector; -import com.replaymod.gui.utils.NonNull; import net.minecraft.client.Minecraft; import org.apache.commons.exec.CommandLine; import org.apache.commons.io.FileUtils; diff --git a/src/main/java/com/replaymod/gui/GuiRenderer.java b/src/main/java/com/replaymod/gui/GuiRenderer.java index 9c753524..21481ec3 100644 --- a/src/main/java/com/replaymod/gui/GuiRenderer.java +++ b/src/main/java/com/replaymod/gui/GuiRenderer.java @@ -24,10 +24,10 @@ */ package com.replaymod.gui; +import com.mojang.blaze3d.matrix.MatrixStack; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.util.ResourceLocation; public interface GuiRenderer { @@ -74,10 +74,11 @@ public interface GuiRenderer { /** * Inverts all colors on the screen. - * @param right Right border of the inverted rectangle + * + * @param right Right border of the inverted rectangle * @param bottom Bottom border of the inverted rectangle - * @param left Left border of the inverted rectangle - * @param top Top border of the inverted rectangle + * @param left Left border of the inverted rectangle + * @param top Top border of the inverted rectangle */ void invertColors(int right, int bottom, int left, int top); diff --git a/src/main/java/com/replaymod/gui/MinecraftGuiRenderer.java b/src/main/java/com/replaymod/gui/MinecraftGuiRenderer.java index d848521c..20827bd5 100644 --- a/src/main/java/com/replaymod/gui/MinecraftGuiRenderer.java +++ b/src/main/java/com/replaymod/gui/MinecraftGuiRenderer.java @@ -24,47 +24,32 @@ */ package com.replaymod.gui; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager; import com.replaymod.gui.utils.NonNull; import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension; +import de.johni0702.minecraft.gui.utils.lwjgl.*; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.AbstractGui; -import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -//#if MC>=10800 -import com.mojang.blaze3d.platform.GlStateManager; import static com.mojang.blaze3d.platform.GlStateManager.*; -//#else -//$$ import net.minecraft.client.renderer.OpenGlHelper; -//$$ import static de.johni0702.minecraft.gui.versions.MCVer.*; -//#endif - import static org.lwjgl.opengl.GL11.*; public class MinecraftGuiRenderer implements GuiRenderer { - private final AbstractGui gui = new AbstractGui(){}; + private final AbstractGui gui = new AbstractGui() { + }; private final Minecraft mc = com.replaymod.gui.versions.MCVer.getMinecraft(); private final MatrixStack matrixStack; @NonNull - //#if MC>=11400 private final int scaledWidth = com.replaymod.gui.versions.MCVer.newScaledResolution(mc).getScaledWidth(); private final int scaledHeight = com.replaymod.gui.versions.MCVer.newScaledResolution(mc).getScaledHeight(); private final double scaleFactor = com.replaymod.gui.versions.MCVer.newScaledResolution(mc).getGuiScaleFactor(); - //#else - //$$ private final int scaledWidth = newScaledResolution(mc).getScaledWidth(); - //$$ private final int scaledHeight = newScaledResolution(mc).getScaledHeight(); - //$$ private final double scaleFactor = newScaledResolution(mc).getScaleFactor(); - //#endif public MinecraftGuiRenderer(MatrixStack matrixStack) { this.matrixStack = matrixStack; @@ -111,55 +96,29 @@ public void setDrawingArea(int x, int y, int width, int height) { @Override public void bindTexture(ResourceLocation location) { - //#if MC>=11500 com.replaymod.gui.versions.MCVer.getMinecraft().getTextureManager().bindTexture(location); - //#else - //$$ MCVer.getMinecraft().getTextureManager().bindTexture(location); - //#endif } @Override public void bindTexture(int glId) { - //#if MC>=10800 GlStateManager.bindTexture(glId); - //#else - //$$ GL11.glBindTexture(GL_TEXTURE_2D, glId); - //#endif } @Override public void drawTexturedRect(int x, int y, int u, int v, int width, int height) { - //#if MC>=11600 gui.blit(matrixStack, x, y, u, v, width, height); - //#else - //#if MC>=11400 - //$$ gui.blit(x, y, u, v, width, height); - //#else - //$$ gui.drawTexturedModalRect(x, y, u, v, width, height); - //#endif - //#endif } @Override public void drawTexturedRect(int x, int y, int u, int v, int width, int height, int uWidth, int vHeight, int textureWidth, int textureHeight) { color(1, 1, 1); - //#if MC>=11600 AbstractGui.blit(matrixStack, x, y, width, height, u, v, uWidth, vHeight, textureWidth, textureHeight); - //#else - //#if MC>=11400 - //$$ DrawableHelper.blit(x, y, width, height, u, v, uWidth, vHeight, textureWidth, textureHeight); - //#else - //$$ Gui.drawScaledCustomSizeModalRect(x, y, u, v, uWidth, vHeight, width, height, textureWidth, textureHeight); - //#endif - //#endif } @Override public void drawRect(int x, int y, int width, int height, int color) { AbstractGui.fill( - //#if MC>=11600 matrixStack, - //#endif x, y, x + width, y + height, color); color(1, 1, 1); enableBlend(); @@ -214,15 +173,11 @@ public int drawString(int x, int y, int color, String text, boolean shadow) { try { if (shadow) { return fontRenderer.drawStringWithShadow( - //#if MC>=11600 matrixStack, - //#endif text, x, y, color); } else { return fontRenderer.drawString( - //#if MC>=11600 matrixStack, - //#endif text, x, y, color); } } finally { @@ -238,7 +193,7 @@ public int drawString(int x, int y, ReadableColor color, String text, boolean sh @Override public int drawCenteredString(int x, int y, int color, String text, boolean shadow) { FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); - x-=fontRenderer.getStringWidth(text) / 2; + x -= fontRenderer.getStringWidth(text) / 2; return drawString(x, y, color, text, shadow); } @@ -259,15 +214,7 @@ private ReadableColor color(int color) { } private void color(int r, int g, int b) { - //#if MC>=10800 - //#if MC>=11400 GlStateManager.color4f(r, g, b, 1); - //#else - //$$ GlStateManager.color(r, g, b); - //#endif - //#else - //$$ MCVer.color(r, g, b); - //#endif } @Override diff --git a/src/main/java/com/replaymod/gui/OffsetGuiRenderer.java b/src/main/java/com/replaymod/gui/OffsetGuiRenderer.java index 3ab381a3..ab44e087 100644 --- a/src/main/java/com/replaymod/gui/OffsetGuiRenderer.java +++ b/src/main/java/com/replaymod/gui/OffsetGuiRenderer.java @@ -24,12 +24,12 @@ */ package com.replaymod.gui; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.gui.utils.NonNull; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; @@ -48,8 +48,9 @@ public class OffsetGuiRenderer implements com.replaymod.gui.GuiRenderer { /** * Creates a new strict offset jgui renderer with the same settings as the supplied one. - * @see #OffsetGuiRenderer(com.replaymod.gui.GuiRenderer, ReadablePoint, ReadableDimension, boolean) + * * @param renderer The renderer to copy from + * @see #OffsetGuiRenderer(com.replaymod.gui.GuiRenderer, ReadablePoint, ReadableDimension, boolean) */ public OffsetGuiRenderer(OffsetGuiRenderer renderer) { this(renderer.renderer, renderer.position, renderer.size, true); @@ -59,9 +60,10 @@ public OffsetGuiRenderer(OffsetGuiRenderer renderer) { * Create a new offset GUI renderer. All calls to this renderer are forwarded to the parent * renderer with coordinates offset by the specified position. * This also ensures that drawing happens within the specified bounds. + * * @param renderer The parent renderer * @param position The position of this renderer within the parent (used as is, not copied) - * @param size The size of the drawable area (used as is, not copied) + * @param size The size of the drawable area (used as is, not copied) */ public OffsetGuiRenderer(com.replaymod.gui.GuiRenderer renderer, ReadablePoint position, ReadableDimension size) { this(renderer, position, size, true); @@ -72,10 +74,11 @@ public OffsetGuiRenderer(com.replaymod.gui.GuiRenderer renderer, ReadablePoint p * Create a new offset GUI renderer. All calls to this renderer are forwarded to the parent * renderer with coordinates offset by the specified position. * If strict is {@code true}, this also ensures that drawing happens within the specified bounds. + * * @param renderer The parent renderer * @param position The position of this renderer within the parent (used as is, not copied) - * @param size The size of the drawable area (used as is, not copied) - * @param strict Whether drawing should be forced to be within the drawable area + * @param size The size of the drawable area (used as is, not copied) + * @param strict Whether drawing should be forced to be within the drawable area */ public OffsetGuiRenderer(GuiRenderer renderer, ReadablePoint position, ReadableDimension size, boolean strict) { this.renderer = renderer; diff --git a/src/main/java/com/replaymod/gui/container/AbstractGuiClickableContainer.java b/src/main/java/com/replaymod/gui/container/AbstractGuiClickableContainer.java index b141460a..d1ab630c 100644 --- a/src/main/java/com/replaymod/gui/container/AbstractGuiClickableContainer.java +++ b/src/main/java/com/replaymod/gui/container/AbstractGuiClickableContainer.java @@ -24,10 +24,10 @@ */ package com.replaymod.gui.container; -import com.replaymod.gui.element.IGuiClickable; -import com.replaymod.gui.function.Clickable; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; +import com.replaymod.gui.element.IGuiClickable; +import com.replaymod.gui.function.Clickable; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; diff --git a/src/main/java/com/replaymod/gui/container/AbstractGuiContainer.java b/src/main/java/com/replaymod/gui/container/AbstractGuiContainer.java index aa88abab..c535ffff 100644 --- a/src/main/java/com/replaymod/gui/container/AbstractGuiContainer.java +++ b/src/main/java/com/replaymod/gui/container/AbstractGuiContainer.java @@ -24,20 +24,20 @@ */ package com.replaymod.gui.container; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.OffsetGuiRenderer; +import com.replaymod.gui.RenderInfo; import com.replaymod.gui.element.AbstractComposedGuiElement; import com.replaymod.gui.element.ComposedGuiElement; import com.replaymod.gui.element.GuiElement; import com.replaymod.gui.layout.HorizontalLayout; -import com.replaymod.gui.layout.LayoutData; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.OffsetGuiRenderer; -import com.replaymod.gui.RenderInfo; import com.replaymod.gui.layout.Layout; +import com.replaymod.gui.layout.LayoutData; +import com.replaymod.gui.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import com.replaymod.gui.versions.MCVer; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.ReportedException; diff --git a/src/main/java/com/replaymod/gui/container/AbstractGuiOverlay.java b/src/main/java/com/replaymod/gui/container/AbstractGuiOverlay.java index 8768305a..8c1a3bc6 100644 --- a/src/main/java/com/replaymod/gui/container/AbstractGuiOverlay.java +++ b/src/main/java/com/replaymod/gui/container/AbstractGuiOverlay.java @@ -24,41 +24,29 @@ */ package com.replaymod.gui.container; -import com.replaymod.gui.element.GuiElement; -import com.replaymod.gui.function.Scrollable; -import com.replaymod.gui.versions.MCVer; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.MinecraftGuiRenderer; import com.replaymod.gui.OffsetGuiRenderer; import com.replaymod.gui.RenderInfo; +import com.replaymod.gui.element.GuiElement; +import com.replaymod.gui.function.Scrollable; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.utils.MouseUtils; +import com.replaymod.gui.versions.MCVer; +import com.replaymod.gui.versions.callbacks.PreTickCallback; +import com.replaymod.gui.versions.callbacks.RenderHudCallback; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import com.replaymod.gui.versions.callbacks.PreTickCallback; -import com.replaymod.gui.versions.callbacks.RenderHudCallback; +import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; -import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.ReportedException; - -//#if MC>=11400 import net.minecraft.util.text.StringTextComponent; -//#endif - -//#if MC>=11400 -import net.minecraft.client.MainWindow; -//#else -//$$ import org.lwjgl.input.Mouse; -//$$ import net.minecraft.client.gui.ScaledResolution; -//#endif -//#if MC>=10800 && MC<11400 -//$$ import java.io.IOException; -//#endif public abstract class AbstractGuiOverlay> extends AbstractGuiContainer { @@ -116,6 +104,7 @@ public boolean isAllowUserInput() { * User input are things like moving the player, attacking/interacting, key bindings but not input into the * GUI elements such as text fields. * Default for overlays is {@code true} whereas for normal GUI screens it is {@code false}. + * * @param allowUserInput {@code true} to allow user input, {@code false} to disallow it * @see net.minecraft.client.gui.screen.Screen#passEvents */ @@ -202,9 +191,13 @@ public ReadableDimension getMaxSize() { } private class EventHandler extends EventRegistrations { - private EventHandler() {} + private EventHandler() { + } + + { + on(RenderHudCallback.EVENT, this::renderOverlay); + } - { on(RenderHudCallback.EVENT, this::renderOverlay); } private void renderOverlay(MatrixStack stack, float partialTicks) { updateUserInputGui(); updateRenderer(); @@ -225,15 +218,13 @@ private void renderOverlay(MatrixStack stack, float partialTicks) { } } - { on(PreTickCallback.EVENT, () -> invokeAll(com.replaymod.gui.function.Tickable.class, com.replaymod.gui.function.Tickable::tick)); } + { + on(PreTickCallback.EVENT, () -> invokeAll(com.replaymod.gui.function.Tickable.class, com.replaymod.gui.function.Tickable::tick)); + } private void updateRenderer() { Minecraft mc = getMinecraft(); - //#if MC>=11400 MainWindow - //#else - //$$ ScaledResolution - //#endif res = MCVer.newScaledResolution(mc); if (screenSize == null || screenSize.getWidth() != res.getScaledWidth() @@ -245,17 +236,14 @@ private void updateRenderer() { protected class UserInputGuiScreen extends net.minecraft.client.gui.screen.Screen { - //#if MC>=11400 UserInputGuiScreen() { super(new StringTextComponent("")); } - //#endif { this.passEvents = true; } - //#if MC>=11400 @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { Point mousePos = MouseUtils.getMousePos(); @@ -277,118 +265,54 @@ public boolean charTyped(char keyChar, int modifiers) { } return true; } - //#else - //$$ @Override - //$$ protected void keyTyped(char typedChar, int keyCode) - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //$$ Point mousePos = MouseUtils.getMousePos(); - //$$ boolean controlDown = isCtrlKeyDown(); - //$$ boolean shiftDown = isShiftKeyDown(); - //$$ invokeHandlers(Typeable.class, e -> e.typeKey(mousePos, keyCode, typedChar, controlDown, shiftDown)); - //$$ if (closeable) { - //$$ super.keyTyped(typedChar, keyCode); - //$$ } - //$$ } - //#endif @Override - //#if MC>=11400 public boolean mouseClicked(double mouseXD, double mouseYD, int mouseButton) { int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); return - //#else - //$$ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //#endif - invokeHandlers(com.replaymod.gui.function.Clickable.class, e -> e.mouseClick(new Point(mouseX, mouseY), mouseButton)); + invokeHandlers(com.replaymod.gui.function.Clickable.class, e -> e.mouseClick(new Point(mouseX, mouseY), mouseButton)); } @Override - //#if MC>=11400 public boolean mouseReleased(double mouseXD, double mouseYD, int mouseButton) { int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); return - //#else - //$$ protected void mouseReleased(int mouseX, int mouseY, int mouseButton) { - //#endif - invokeHandlers(com.replaymod.gui.function.Draggable.class, e -> e.mouseRelease(new Point(mouseX, mouseY), mouseButton)); + invokeHandlers(com.replaymod.gui.function.Draggable.class, e -> e.mouseRelease(new Point(mouseX, mouseY), mouseButton)); } @Override - //#if MC>=11400 public boolean mouseDragged(double mouseXD, double mouseYD, int mouseButton, double deltaX, double deltaY) { int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); long timeSinceLastClick = 0; return - //#else - //$$ protected void mouseClickMove(int mouseX, int mouseY, int mouseButton, long timeSinceLastClick) { - //#endif - invokeHandlers(com.replaymod.gui.function.Draggable.class, e -> e.mouseDrag(new Point(mouseX, mouseY), mouseButton, timeSinceLastClick)); + invokeHandlers(com.replaymod.gui.function.Draggable.class, e -> e.mouseDrag(new Point(mouseX, mouseY), mouseButton, timeSinceLastClick)); } @Override - //#if MC>=11400 public void tick() { - //#else - //$$ public void updateScreen() { - //#endif invokeAll(com.replaymod.gui.function.Tickable.class, com.replaymod.gui.function.Tickable::tick); } - //#if MC>=11400 @Override public boolean mouseScrolled( - //#if MC>=11400 double mouseX, double mouseY, - //#endif double dWheel ) { - //#if MC>=11400 Point mouse = new Point((int) mouseX, (int) mouseY); - //#else - //$$ Point mouse = MouseUtils.getMousePos(); - //#endif int wheel = (int) (dWheel * 120); return invokeHandlers(Scrollable.class, e -> e.scroll(mouse, wheel)); } - //#else - //$$ @Override - //$$ public void handleMouseInput() - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //$$ super.handleMouseInput(); - //$$ if (Mouse.hasWheel() && Mouse.getEventDWheel() != 0) { - //$$ Point mouse = MouseUtils.getMousePos(); - //$$ int wheel = Mouse.getEventDWheel(); - //$$ invokeHandlers(Scrollable.class, e -> e.scroll(mouse, wheel)); - //$$ } - //$$ } - //#endif - - //#if MC>=11400 + @Override public void closeScreen() { if (closeable) { super.closeScreen(); } } - //#endif @Override - //#if MC>=11400 public void onClose() { - //#else - //$$ public void onGuiClosed() { - //#endif if (closeable) { mouseVisible = false; } diff --git a/src/main/java/com/replaymod/gui/container/AbstractGuiScreen.java b/src/main/java/com/replaymod/gui/container/AbstractGuiScreen.java index bb46bac3..0207119a 100644 --- a/src/main/java/com/replaymod/gui/container/AbstractGuiScreen.java +++ b/src/main/java/com/replaymod/gui/container/AbstractGuiScreen.java @@ -24,36 +24,23 @@ */ package com.replaymod.gui.container; -import com.replaymod.gui.element.GuiElement; -import com.replaymod.gui.element.GuiLabel; -import com.replaymod.gui.function.Loadable; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.MinecraftGuiRenderer; import com.replaymod.gui.OffsetGuiRenderer; import com.replaymod.gui.RenderInfo; +import com.replaymod.gui.element.GuiElement; +import com.replaymod.gui.element.GuiLabel; +import com.replaymod.gui.function.Loadable; import com.replaymod.gui.utils.MouseUtils; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.ReportedException; -//#if MC>=11400 -//#else -//$$ import org.lwjgl.input.Keyboard; -//$$ import org.lwjgl.input.Mouse; -//#endif - -//#if MC>=10800 - - -//#if MC<11400 -//$$ import java.io.IOException; -//#endif -//#endif public abstract class AbstractGuiScreen> extends AbstractGuiContainer { @@ -99,22 +86,14 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render case NONE: break; case DEFAULT: - //#if MC>=11600 wrapped.renderBackground(renderer.getMatrixStack()); - //#else - //$$ wrapped.renderBackground(); - //#endif break; case TRANSPARENT: int top = 0xc0_10_10_10, bottom = 0xd0_10_10_10; renderer.drawRect(0, 0, size.getWidth(), size.getHeight(), top, top, bottom, bottom); break; case DIRT: - //#if MC>=11600 wrapped.renderDirtBackground(0); - //#else - //$$ wrapped.renderDirtBackground(0); - //#endif break; } if (title != null) { @@ -205,7 +184,6 @@ public void setTitle(GuiLabel title) { protected class MinecraftGuiScreen extends net.minecraft.client.gui.screen.Screen { private boolean active; - //#if MC>=11400 protected MinecraftGuiScreen() { super(null); } @@ -214,25 +192,11 @@ protected MinecraftGuiScreen() { public String getNarrationMessage() { return title == null ? "" : title.getString(); } - //#endif @Override - //#if MC>=11600 public void render(MatrixStack stack, int mouseX, int mouseY, float partialTicks) { - //#else - //#if MC>=11400 - //$$ public void render(int mouseX, int mouseY, float partialTicks) { - //#else - //$$ public void drawScreen(int mouseX, int mouseY, float partialTicks) { - //#endif - //$$ MatrixStack stack = new MatrixStack(); - //#endif // The Forge loading screen apparently leaves one of the textures of the GlStateManager in an // incorrect state which can cause the whole screen to just remain white. This is a workaround. - //#if MC>=10800 && MC<11400 - //$$ GlStateManager.disableTexture2D(); - //$$ GlStateManager.enableTexture2D(); - //#endif int layers = getMaxLayer(); RenderInfo renderInfo = new RenderInfo(partialTicks, mouseX, mouseY, 0); @@ -245,7 +209,6 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float partialTicks } } - //#if MC>=11400 @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { Point mouse = MouseUtils.getMousePos(); @@ -273,111 +236,47 @@ public boolean charTyped(char keyChar, int scanCode) { } return true; } - //#else - //$$ @Override - //$$ protected void keyTyped(char typedChar, int keyCode) - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //$$ Point mouse = MouseUtils.getMousePos(); - //$$ boolean ctrlDown = isCtrlKeyDown(); - //$$ boolean shiftDown = isShiftKeyDown(); - //$$ if (!invokeHandlers(Typeable.class, e -> e.typeKey(mouse, keyCode, typedChar, ctrlDown, shiftDown))) { - //$$ if (suppressVanillaKeys) { - //$$ return; - //$$ } - //$$ super.keyTyped(typedChar, keyCode); - //$$ } - //$$ } - //#endif @Override - //#if MC>=11400 public boolean mouseClicked(double mouseXD, double mouseYD, int mouseButton) { int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); return - //#else - //$$ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //#endif - invokeHandlers(com.replaymod.gui.function.Clickable.class, e -> e.mouseClick(new Point(mouseX, mouseY), mouseButton)); + invokeHandlers(com.replaymod.gui.function.Clickable.class, e -> e.mouseClick(new Point(mouseX, mouseY), mouseButton)); } @Override - //#if MC>=11400 public boolean mouseReleased(double mouseXD, double mouseYD, int mouseButton) { int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); return - //#else - //$$ protected void mouseReleased(int mouseX, int mouseY, int mouseButton) { - //#endif - invokeHandlers(com.replaymod.gui.function.Draggable.class, e -> e.mouseRelease(new Point(mouseX, mouseY), mouseButton)); + invokeHandlers(com.replaymod.gui.function.Draggable.class, e -> e.mouseRelease(new Point(mouseX, mouseY), mouseButton)); } @Override - //#if MC>=11400 public boolean mouseDragged(double mouseXD, double mouseYD, int mouseButton, double deltaX, double deltaY) { int mouseX = (int) Math.round(mouseXD), mouseY = (int) Math.round(mouseYD); long timeSinceLastClick = 0; return - //#else - //$$ protected void mouseClickMove(int mouseX, int mouseY, int mouseButton, long timeSinceLastClick) { - //#endif - invokeHandlers(com.replaymod.gui.function.Draggable.class, e -> e.mouseDrag(new Point(mouseX, mouseY), mouseButton, timeSinceLastClick)); + invokeHandlers(com.replaymod.gui.function.Draggable.class, e -> e.mouseDrag(new Point(mouseX, mouseY), mouseButton, timeSinceLastClick)); } @Override - //#if MC>=11400 public void tick() { - //#else - //$$ public void updateScreen() { - //#endif invokeAll(com.replaymod.gui.function.Tickable.class, com.replaymod.gui.function.Tickable::tick); } - //#if MC>=11400 @Override public boolean mouseScrolled( - //#if MC>=11400 double mouseX, double mouseY, - //#endif double dWheel ) { - //#if MC>=11400 Point mouse = new Point((int) mouseX, (int) mouseY); - //#else - //$$ Point mouse = MouseUtils.getMousePos(); - //#endif int wheel = (int) (dWheel * 120); return invokeHandlers(com.replaymod.gui.function.Scrollable.class, e -> e.scroll(mouse, wheel)); } - //#else - //$$ @Override - //$$ public void handleMouseInput() - //#if MC>=10800 - //$$ throws IOException - //#endif - //$$ { - //$$ super.handleMouseInput(); - //$$ if (Mouse.hasWheel() && Mouse.getEventDWheel() != 0) { - //$$ Point mouse = MouseUtils.getMousePos(); - //$$ int wheel = Mouse.getEventDWheel(); - //$$ invokeHandlers(Scrollable.class, e -> e.scroll(mouse, wheel)); - //$$ } - //$$ } - //#endif @Override - //#if MC>=11400 public void onClose() { - //#else - //$$ public void onGuiClosed() { - //#endif invokeAll(com.replaymod.gui.function.Closeable.class, com.replaymod.gui.function.Closeable::close); active = false; if (enabledRepeatedKeyEvents) { @@ -386,11 +285,7 @@ public void onClose() { } @Override - //#if MC>=11400 public void init() { - //#else - //$$ public void initGui() { - //#endif active = false; if (enabledRepeatedKeyEvents) { com.replaymod.gui.versions.MCVer.Keyboard.enableRepeatEvents(true); diff --git a/src/main/java/com/replaymod/gui/container/AbstractGuiScrollable.java b/src/main/java/com/replaymod/gui/container/AbstractGuiScrollable.java index 767ed5d7..47421328 100644 --- a/src/main/java/com/replaymod/gui/container/AbstractGuiScrollable.java +++ b/src/main/java/com/replaymod/gui/container/AbstractGuiScrollable.java @@ -24,16 +24,12 @@ */ package com.replaymod.gui.container; -import com.replaymod.gui.element.GuiElement; -import com.replaymod.gui.function.Scrollable; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.OffsetGuiRenderer; import com.replaymod.gui.RenderInfo; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; +import com.replaymod.gui.element.GuiElement; +import com.replaymod.gui.function.Scrollable; +import de.johni0702.minecraft.gui.utils.lwjgl.*; public abstract class AbstractGuiScrollable> extends AbstractGuiContainer implements Scrollable { @@ -70,7 +66,7 @@ public AbstractGuiScrollable(GuiContainer container) { public void convertFor(GuiElement element, Point point, int relativeLayer) { super.convertFor(element, point, relativeLayer); if (relativeLayer > 0 || (point.getX() > 0 && point.getX() < lastRenderSize.getWidth() - && point.getY() > 0 && point.getY() < lastRenderSize.getHeight())) { + && point.getY() > 0 && point.getY() < lastRenderSize.getHeight())) { point.translate(offsetX, offsetY); } else { point.setLocation(Integer.MIN_VALUE, Integer.MIN_VALUE); diff --git a/src/main/java/com/replaymod/gui/container/AbstractGuiVerticalList.java b/src/main/java/com/replaymod/gui/container/AbstractGuiVerticalList.java index c44a54cf..908a721d 100644 --- a/src/main/java/com/replaymod/gui/container/AbstractGuiVerticalList.java +++ b/src/main/java/com/replaymod/gui/container/AbstractGuiVerticalList.java @@ -24,17 +24,12 @@ */ package com.replaymod.gui.container; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.RenderInfo; import com.replaymod.gui.function.Draggable; import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.VerticalLayout; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.RenderInfo; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension; +import de.johni0702.minecraft.gui.utils.lwjgl.*; import static com.replaymod.gui.utils.Colors.TRANSPARENT; import static de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor.BLACK; diff --git a/src/main/java/com/replaymod/gui/container/GuiContainer.java b/src/main/java/com/replaymod/gui/container/GuiContainer.java index 3e91a5cb..f1bcdab8 100644 --- a/src/main/java/com/replaymod/gui/container/GuiContainer.java +++ b/src/main/java/com/replaymod/gui/container/GuiContainer.java @@ -26,8 +26,8 @@ import com.replaymod.gui.element.ComposedGuiElement; import com.replaymod.gui.element.GuiElement; -import com.replaymod.gui.layout.LayoutData; import com.replaymod.gui.layout.Layout; +import com.replaymod.gui.layout.LayoutData; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; @@ -37,25 +37,32 @@ public interface GuiContainer> extends ComposedGuiElement { T setLayout(Layout layout); + Layout getLayout(); void convertFor(com.replaymod.gui.element.GuiElement element, Point point); /** * Converts the global coordinates of the point to ones relative to the element. - * @param element The element, must be part of this container - * @param point The point + * + * @param element The element, must be part of this container + * @param point The point * @param relativeLayer Layer at which the point is relative to this element, * positive values are above this element */ void convertFor(com.replaymod.gui.element.GuiElement element, Point point, int relativeLayer); Map getElements(); + T addElements(LayoutData layoutData, com.replaymod.gui.element.GuiElement... elements); + T removeElement(com.replaymod.gui.element.GuiElement element); + T sortElements(); + T sortElements(Comparator comparator); ReadableColor getBackgroundColor(); + T setBackgroundColor(ReadableColor backgroundColor); } diff --git a/src/main/java/com/replaymod/gui/container/GuiPanel.java b/src/main/java/com/replaymod/gui/container/GuiPanel.java index d6a339f3..743d236e 100644 --- a/src/main/java/com/replaymod/gui/container/GuiPanel.java +++ b/src/main/java/com/replaymod/gui/container/GuiPanel.java @@ -25,8 +25,8 @@ package com.replaymod.gui.container; import com.replaymod.gui.element.GuiElement; -import com.replaymod.gui.layout.LayoutData; import com.replaymod.gui.layout.Layout; +import com.replaymod.gui.layout.LayoutData; import java.util.ArrayList; import java.util.Map; @@ -40,7 +40,7 @@ public GuiPanel(GuiContainer container) { super(container); } - GuiPanel(Layout layout, int width , int height, Map withElements) { + GuiPanel(Layout layout, int width, int height, Map withElements) { setLayout(layout); if (width != 0 || height != 0) { setSize(width, height); diff --git a/src/main/java/com/replaymod/gui/container/VanillaGuiScreen.java b/src/main/java/com/replaymod/gui/container/VanillaGuiScreen.java index 3c6cf653..e90bda7d 100644 --- a/src/main/java/com/replaymod/gui/container/VanillaGuiScreen.java +++ b/src/main/java/com/replaymod/gui/container/VanillaGuiScreen.java @@ -1,43 +1,21 @@ package com.replaymod.gui.container; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.gui.function.Draggable; import com.replaymod.gui.function.Scrollable; import com.replaymod.gui.function.Typeable; -import com.replaymod.gui.versions.MCVer; import com.replaymod.gui.utils.EventRegistrations; import com.replaymod.gui.utils.MouseUtils; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; +import com.replaymod.gui.versions.MCVer; import com.replaymod.gui.versions.callbacks.InitScreenCallback; import com.replaymod.gui.versions.callbacks.OpenGuiScreenCallback; import com.replaymod.gui.versions.callbacks.PostRenderScreenCallback; import com.replaymod.gui.versions.callbacks.PreTickCallback; -import com.mojang.blaze3d.matrix.MatrixStack; - -//#if FABRIC>=1 -//$$ import com.replaymod.gui.versions.callbacks.KeyboardCallback; -//$$ import com.replaymod.gui.versions.callbacks.MouseCallback; -//#elseif MC>=11600 +import de.johni0702.minecraft.gui.utils.lwjgl.Point; +import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; -//#else -//$$ import net.minecraftforge.client.event.GuiOpenEvent; -//$$ import net.minecraftforge.client.event.GuiScreenEvent; -//$$ import net.minecraftforge.fml.common.eventhandler.EventPriority; -//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -//#endif - -//#if MC<10800 -//$$ import cpw.mods.fml.common.eventhandler.Cancelable; -//$$ import cpw.mods.fml.common.eventhandler.Event; -//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; -//#endif - -//#if MC<11400 -//$$ import net.minecraftforge.common.MinecraftForge; -//$$ import java.io.IOException; -//#endif import java.util.Collections; import java.util.Map; @@ -109,63 +87,38 @@ private net.minecraft.client.gui.screen.Screen getSuperMcGui() { @Override public boolean mouseClick(ReadablePoint position, int button) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif return false; } @Override public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif return false; } @Override public boolean mouseRelease(ReadablePoint position, int button) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif return false; } @Override public boolean scroll(ReadablePoint mousePosition, int dWheel) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif return false; } @Override public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) { - //#if MC>=11400 - //#else - //$$ eventHandler.handled = false; - //#endif return false; } // Used when wrapping an already existing mc.GuiScreen - //#if MC>=10800 private - //#else - //$$ public - //#endif - class EventHandler extends EventRegistrations - //#if FABRIC>=1 - //$$ implements KeyboardCallback, MouseCallback - //#endif - { + class EventHandler extends EventRegistrations { private boolean active; - { on(OpenGuiScreenCallback.EVENT, screen -> onGuiClosed()); } + { + on(OpenGuiScreenCallback.EVENT, screen -> onGuiClosed()); + } + private void onGuiClosed() { unregister(); @@ -176,7 +129,10 @@ private void onGuiClosed() { } } - { on(InitScreenCallback.Pre.EVENT, this::preGuiInit); } + { + on(InitScreenCallback.Pre.EVENT, this::preGuiInit); + } + private void preGuiInit(net.minecraft.client.gui.screen.Screen screen) { if (screen == mcScreen && active) { active = false; @@ -186,73 +142,35 @@ private void preGuiInit(net.minecraft.client.gui.screen.Screen screen) { } } - { on(PostRenderScreenCallback.EVENT, this::onGuiRender); } + { + on(PostRenderScreenCallback.EVENT, this::onGuiRender); + } + private void onGuiRender(MatrixStack stack, float partialTicks) { Point mousePos = MouseUtils.getMousePos(); getSuperMcGui().render( - //#if MC>=11600 stack, - //#endif mousePos.getX(), mousePos.getY(), partialTicks); } - { on(PreTickCallback.EVENT, this::tickOverlay); } + { + on(PreTickCallback.EVENT, this::tickOverlay); + } + private void tickOverlay() { - //#if MC>=11400 getSuperMcGui().tick(); - //#else - //$$ getSuperMcGui().updateScreen(); - //#endif } - //#if FABRIC>=1 - //$$ { on(MouseCallback.EVENT, this); } - //$$ - //$$ @Override - //$$ public boolean mouseDown(double x, double y, int button) { - //$$ return getSuperMcGui().mouseClicked(x, y, button); - //$$ } - //$$ - //$$ @Override - //$$ public boolean mouseDrag(double x, double y, int button, double dx, double dy) { - //$$ return getSuperMcGui().mouseDragged(x, y, button, dx, dy); - //$$ } - //$$ - //$$ @Override - //$$ public boolean mouseUp(double x, double y, int button) { - //$$ return getSuperMcGui().mouseReleased(x, y, button); - //$$ } - //$$ - //$$ @Override - //$$ public boolean mouseScroll(double x, double y, double scroll) { - //$$ return getSuperMcGui().mouseScrolled(x, y, scroll); - //$$ } - //$$ - //$$ { on(KeyboardCallback.EVENT, this); } - //$$ - //$$ @Override - //$$ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - //$$ return getSuperMcGui().keyPressed(keyCode, scanCode, modifiers); - //$$ } - //$$ - //$$ @Override - //$$ public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - //$$ return getSuperMcGui().keyReleased(keyCode, scanCode, modifiers); - //$$ } - //$$ - //$$ @Override - //$$ public boolean charTyped(char keyChar, int scanCode) { - //$$ return getSuperMcGui().charTyped(keyChar, scanCode); - //$$ } - //#elseif MC>11600 private boolean handled; + @SubscribeEvent(priority = EventPriority.LOWEST) public void mouseClicked(GuiScreenEvent.MouseClickedEvent event) { handled = getSuperMcGui().mouseClicked(event.getMouseX(), event.getMouseY(), event.getButton()); if (handled) { - event.setCanceled(true); + event.setCanceled(true); } } + @SubscribeEvent(priority = EventPriority.LOWEST) public void mouseDrag(GuiScreenEvent.MouseDragEvent event) { handled = getSuperMcGui().mouseDragged(event.getMouseX(), event.getMouseY(), event.getMouseButton(), event.getDragX(), event.getDragY()); @@ -260,6 +178,7 @@ public void mouseDrag(GuiScreenEvent.MouseDragEvent event) { event.setCanceled(true); } } + @SubscribeEvent(priority = EventPriority.LOWEST) public void mouseClicked(GuiScreenEvent.MouseReleasedEvent event) { handled = getSuperMcGui().mouseReleased(event.getMouseX(), event.getMouseY(), event.getButton()); @@ -267,6 +186,7 @@ public void mouseClicked(GuiScreenEvent.MouseReleasedEvent event) { event.setCanceled(true); } } + @SubscribeEvent(priority = EventPriority.LOWEST) public void mouseClicked(GuiScreenEvent.MouseScrollEvent event) { handled = getSuperMcGui().mouseScrolled(event.getMouseX(), event.getMouseY(), event.getScrollDelta()); @@ -274,6 +194,7 @@ public void mouseClicked(GuiScreenEvent.MouseScrollEvent event) { event.setCanceled(true); } } + @SubscribeEvent(priority = EventPriority.LOWEST) public void mouseClicked(GuiScreenEvent.KeyboardKeyPressedEvent event) { handled = getSuperMcGui().keyPressed(event.getKeyCode(), event.getScanCode(), event.getModifiers()); @@ -281,6 +202,7 @@ public void mouseClicked(GuiScreenEvent.KeyboardKeyPressedEvent event) { event.setCanceled(true); } } + @SubscribeEvent(priority = EventPriority.LOWEST) public void mouseClicked(GuiScreenEvent.KeyboardKeyReleasedEvent event) { handled = getSuperMcGui().keyReleased(event.getKeyCode(), event.getScanCode(), event.getModifiers()); @@ -288,6 +210,7 @@ public void mouseClicked(GuiScreenEvent.KeyboardKeyReleasedEvent event) { event.setCanceled(true); } } + @SubscribeEvent(priority = EventPriority.LOWEST) public void mouseClicked(GuiScreenEvent.KeyboardCharTypedEvent event) { handled = getSuperMcGui().charTyped(event.getCodePoint(), event.getModifiers()); @@ -295,43 +218,5 @@ public void mouseClicked(GuiScreenEvent.KeyboardCharTypedEvent event) { event.setCanceled(true); } } - //#else - //$$ private boolean handled; - //$$ - //$$ // Mouse/Keyboard events aren't supported in 1.7.10 - //$$ // so this requires a mixin in any mod making use of it - //$$ // (see ReplayMod: GuiScreenMixin) - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //#if MC>=10800 - //$$ public void onMouseInput(GuiScreenEvent.MouseInputEvent.Pre event) throws IOException { - //#else - //$$ public void onMouseInput(MouseInputEvent event) throws IOException { - //#endif - //$$ handled = true; - //$$ getSuperMcGui().handleMouseInput(); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } - //$$ } - //$$ - //$$ @SubscribeEvent(priority = EventPriority.LOWEST) - //#if MC>=10800 - //$$ public void onKeyboardInput(GuiScreenEvent.KeyboardInputEvent.Pre event) throws IOException { - //#else - //$$ public void onKeyboardInput(KeyboardInputEvent event) throws IOException { - //#endif - //$$ handled = true; - //$$ getSuperMcGui().handleKeyboardInput(); - //$$ if (handled) { - //$$ event.setCanceled(true); - //$$ } - //$$ } - //#endif } - //#if MC<=10710 - //$$ @Cancelable - //$$ public static class MouseInputEvent extends Event {} - //$$ @Cancelable - //$$ public static class KeyboardInputEvent extends Event {} - //#endif } diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiButton.java b/src/main/java/com/replaymod/gui/element/AbstractGuiButton.java index 78af4d41..53f990bd 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiButton.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiButton.java @@ -28,31 +28,20 @@ import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.function.Clickable; +import com.replaymod.gui.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import com.replaymod.gui.versions.MCVer; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.SimpleSound; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; import net.minecraft.util.ResourceLocation; - -//#if MC>=11400 -import net.minecraft.client.audio.SimpleSound; -//#else -//$$ import net.minecraft.client.audio.PositionedSoundRecord; -//#endif - -//#if MC>=10904 -import net.minecraft.util.SoundEvents; import net.minecraft.util.SoundEvent; -//#endif +import net.minecraft.util.SoundEvents; -//#if MC>=10800 import static com.mojang.blaze3d.platform.GlStateManager.*; -//#endif - import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA; import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA; @@ -60,9 +49,7 @@ public abstract class AbstractGuiButton> extends protected static final ResourceLocation BUTTON_SOUND = new ResourceLocation("gui.button.press"); protected static final ResourceLocation WIDGETS_TEXTURE = new ResourceLocation("textures/gui/widgets.png"); - //#if MC>=10904 private SoundEvent sound = SoundEvents.UI_BUTTON_CLICK; - //#endif private int labelColor = 0xe0e0e0; private String label; @@ -145,24 +132,11 @@ public void onClick() { } public static void playClickSound(Minecraft mc) { - //#if MC>=10904 playClickSound(mc, SoundEvents.UI_BUTTON_CLICK); } + public static void playClickSound(Minecraft mc, SoundEvent sound) { - //#endif - //#if MC>=11400 mc.getSoundHandler().play(SimpleSound.master(sound, 1.0F)); - //#else - //#if MC>=10904 - //$$ mc.getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(sound, 1.0F)); - //#else - //#if MC>=10800 - //$$ mc.getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); - //#else - //$$ mc.getSoundHandler().playSound(PositionedSoundRecord.createPositionedSoundRecord(BUTTON_SOUND, 1.0F)); - //#endif - //#endif - //#endif } @Override @@ -171,7 +145,6 @@ public T setLabel(String label) { return getThis(); } - //#if MC>=10904 @Override public T setSound(SoundEvent sound) { this.sound = sound; @@ -181,7 +154,6 @@ public T setSound(SoundEvent sound) { public SoundEvent getSound() { return this.sound; } - //#endif @Override public T setI18nLabel(String label, Object... args) { diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiCheckbox.java b/src/main/java/com/replaymod/gui/element/AbstractGuiCheckbox.java index 48051e49..9d7b5ca3 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiCheckbox.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiCheckbox.java @@ -27,11 +27,11 @@ import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; +import com.replaymod.gui.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.Color; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import com.replaymod.gui.versions.MCVer; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; import net.minecraft.util.ResourceLocation; @@ -65,7 +65,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render renderer.drawRect(0, 0, boxSize, boxSize, ReadableColor.BLACK); renderer.drawRect(1, 1, boxSize - 2, boxSize - 2, BOX_BACKGROUND_COLOR); - if(isChecked()) { + if (isChecked()) { renderer.drawCenteredString(boxSize / 2 + 1, 1, color, "x", true); } diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiElement.java b/src/main/java/com/replaymod/gui/element/AbstractGuiElement.java index a7de1cc8..bb112214 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiElement.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiElement.java @@ -27,10 +27,10 @@ import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; +import com.replaymod.gui.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Point; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import com.replaymod.gui.versions.MCVer; import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiImage.java b/src/main/java/com/replaymod/gui/element/AbstractGuiImage.java index 88acebda..f255b704 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiImage.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiImage.java @@ -28,9 +28,9 @@ import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; +import com.replaymod.gui.versions.Image; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import com.replaymod.gui.versions.Image; import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.util.ResourceLocation; @@ -84,11 +84,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render protected void finalize() throws Throwable { super.finalize(); if (texture != null && copyOf == null) { - //#if MC>=11400 getMinecraft().execute(new Finalizer(texture)); - //#else - //$$ getMinecraft().addScheduledTask(new Finalizer(texture)); - //#endif } } diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiLabel.java b/src/main/java/com/replaymod/gui/element/AbstractGuiLabel.java index b559ce6b..b387b855 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiLabel.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiLabel.java @@ -27,21 +27,18 @@ import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; +import com.replaymod.gui.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import com.replaymod.gui.versions.MCVer; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.Style; import java.util.List; - -//#if MC>=11600 import java.util.Optional; import java.util.stream.Collectors; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.Style; -//#endif public abstract class AbstractGuiLabel> extends AbstractGuiElement implements IGuiLabel { private String text = ""; @@ -59,18 +56,13 @@ public AbstractGuiLabel(GuiContainer container) { public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { super.draw(renderer, size, renderInfo); FontRenderer fontRenderer = MCVer.getFontRenderer(); - //#if MC>=11600 List lines = fontRenderer.getCharacterManager().func_238362_b_(new StringTextComponent(text), size.getWidth(), Style.EMPTY).stream() .map(it -> it.getComponent(Optional::of)).filter(Optional::isPresent).map(Optional::get) .collect(Collectors.toList()); - //#else - //$$ @SuppressWarnings("unchecked") - //$$ List lines = fontRenderer.wrapStringToWidthAsList(text, size.getWidth()); - //#endif int y = 0; for (String line : lines) { renderer.drawString(0, y, isEnabled() ? color : disabledColor, line); - y+=fontRenderer.FONT_HEIGHT; + y += fontRenderer.FONT_HEIGHT; } } diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiTextField.java b/src/main/java/com/replaymod/gui/element/AbstractGuiTextField.java index bf0e22c4..f7ad0641 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiTextField.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiTextField.java @@ -34,26 +34,15 @@ import com.replaymod.gui.function.Tickable; import com.replaymod.gui.function.Typeable; import com.replaymod.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import com.replaymod.gui.versions.MCVer; +import de.johni0702.minecraft.gui.utils.lwjgl.*; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.resources.I18n; - -//#if MC>=11400 import net.minecraft.util.SharedConstants; -//#else -//$$ import net.minecraft.util.ChatAllowedCharacters; -//$$ import org.lwjgl.input.Keyboard; -//#endif import static com.replaymod.gui.utils.Utils.clamp; -import static com.replaymod.gui.versions.MCVer.*; +import static com.replaymod.gui.versions.MCVer.Keyboard; public abstract class AbstractGuiTextField> extends AbstractGuiElement implements Clickable, Tickable, Typeable, IGuiTextField { @@ -163,8 +152,8 @@ private void updateCurrentOffset() { String line = text.substring(currentOffset, cursorPos); FontRenderer fontRenderer = MCVer.getFontRenderer(); int currentWidth = fontRenderer.getStringWidth(line); - if (currentWidth > size.getWidth() - 2*BORDER) { - currentOffset = cursorPos - fontRenderer.getLineScrollOffset(line, size.getWidth() - 2*BORDER, true).length(); + if (currentWidth > size.getWidth() - 2 * BORDER) { + currentOffset = cursorPos - fontRenderer.getLineScrollOffset(line, size.getWidth() - 2 * BORDER, true).length(); } } @@ -178,11 +167,7 @@ public T writeText(String append) { @Override public T writeChar(char c) { - //#if MC>=11400 if (!SharedConstants.isAllowedCharacter(c)) { - //#else - //$$ if (!ChatAllowedCharacters.isAllowedCharacter(c)) { - //#endif return getThis(); } @@ -211,6 +196,7 @@ public T deleteNextChar() { * Return the amount of characters to the next word (excluding). * If this is the last word in the line, return the amount of characters remaining to till the end. * Everything except the Space character is considered part of a word. + * * @return Length in characters */ protected int getNextWordLength() { @@ -253,6 +239,7 @@ public T deletePreviousChar() { * Return the amount of characters to the previous word (including). * If this is the first word in the line, return the amount of characters till the start. * Everything except the Space character is considered part of a word. + * * @return Length in characters */ protected int getPreviousWordLength() { @@ -363,12 +350,12 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render if (text.isEmpty() && !isFocused() && !Strings.isNullOrEmpty(hint)) { // Draw hint - String text = fontRenderer.trimStringToWidth(hint, width - 2*BORDER); + String text = fontRenderer.trimStringToWidth(hint, width - 2 * BORDER); renderer.drawString(BORDER, posY, textColorDisabled, text); } else { // Draw text String renderText = text.substring(currentOffset); - renderText = fontRenderer.trimStringToWidth(renderText, width - 2*BORDER); + renderText = fontRenderer.trimStringToWidth(renderText, width - 2 * BORDER); ReadableColor color = isEnabled() ? textColorEnabled : textColorDisabled; int lineEnd = renderer.drawString(BORDER, height / 2 - fontRenderer.FONT_HEIGHT / 2, color, renderText); diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiTexturedButton.java b/src/main/java/com/replaymod/gui/element/AbstractGuiTexturedButton.java index b2b261a8..a257c03d 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiTexturedButton.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiTexturedButton.java @@ -28,32 +28,19 @@ import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.function.Clickable; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; +import de.johni0702.minecraft.gui.utils.lwjgl.*; import net.minecraft.util.ResourceLocation; - -//#if MC>=10904 -import net.minecraft.util.SoundEvents; import net.minecraft.util.SoundEvent; -//#endif +import net.minecraft.util.SoundEvents; -//#if MC>=10800 import static com.mojang.blaze3d.platform.GlStateManager.*; -//#endif - import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA; import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA; public abstract class AbstractGuiTexturedButton> extends AbstractGuiClickable implements Clickable, IGuiTexturedButton { private ResourceLocation texture; - //#if MC>=10904 private SoundEvent sound = SoundEvents.UI_BUTTON_CLICK; - //#endif private ReadableDimension textureSize = new ReadableDimension() { @Override @@ -121,11 +108,7 @@ public ReadableDimension calcMinSize() { @Override public void onClick() { - //#if MC>=10904 AbstractGuiButton.playClickSound(getMinecraft(), sound); - //#else - //$$ AbstractGuiButton.playClickSound(getMinecraft()); - //#endif super.onClick(); } @@ -229,7 +212,6 @@ public T setTexturePos(ReadablePoint normal, ReadablePoint hover, ReadablePoint return setTexturePos(normal, hover); } - //#if MC>=10904 @Override public T setSound(SoundEvent sound) { this.sound = sound; @@ -239,7 +221,6 @@ public T setSound(SoundEvent sound) { public SoundEvent getSound() { return this.sound; } - //#endif public ResourceLocation getTexture() { return this.texture; diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiToggleButton.java b/src/main/java/com/replaymod/gui/element/AbstractGuiToggleButton.java index bceb218f..298da29a 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiToggleButton.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiToggleButton.java @@ -30,7 +30,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; public abstract class AbstractGuiToggleButton> - extends AbstractGuiButton implements IGuiToggleButton { + extends AbstractGuiButton implements IGuiToggleButton { private int selected; diff --git a/src/main/java/com/replaymod/gui/element/AbstractGuiTooltip.java b/src/main/java/com/replaymod/gui/element/AbstractGuiTooltip.java index 8a6b274d..303ebe6f 100644 --- a/src/main/java/com/replaymod/gui/element/AbstractGuiTooltip.java +++ b/src/main/java/com/replaymod/gui/element/AbstractGuiTooltip.java @@ -27,11 +27,11 @@ import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; import com.replaymod.gui.utils.StringUtils; +import com.replaymod.gui.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.Color; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import com.replaymod.gui.versions.MCVer; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.resources.I18n; @@ -82,7 +82,7 @@ public ReadableDimension calcMinSize() { width = w; } } - width+=4 * 2; + width += 4 * 2; return new Dimension(width, height); } @@ -91,7 +91,7 @@ public ReadableDimension getMaxSize() { return getMinSize(); } - public T setText(String[]text) { + public T setText(String[] text) { this.text = text; return getThis(); } diff --git a/src/main/java/com/replaymod/gui/element/ComposedGuiElement.java b/src/main/java/com/replaymod/gui/element/ComposedGuiElement.java index 248adf70..5d4a3b91 100644 --- a/src/main/java/com/replaymod/gui/element/ComposedGuiElement.java +++ b/src/main/java/com/replaymod/gui/element/ComposedGuiElement.java @@ -32,7 +32,7 @@ public interface ComposedGuiElement> extends com.replaymod.gui.element.GuiElement { Collection getChildren(); - default R forEach(Class ofType, Function function) { + default R forEach(Class ofType, Function function) { return forEach((elem, elemLayer) -> elem.forEach(elemLayer, ofType, function)); } @@ -53,14 +53,14 @@ default R forEach(int layer, Class ofType, Function function) { R forEach(int layer, Class ofType, BiFunction, Integer, R> recurse, Function function); - default void invokeAll(Class ofType, Consumer consumer) { + default void invokeAll(Class ofType, Consumer consumer) { forEach((elem, elemLayer) -> { elem.invokeAll(elemLayer, ofType, consumer); return null; }); } - default void invokeAll(int layer, Class ofType, Consumer consumer) { + default void invokeAll(int layer, Class ofType, Consumer consumer) { forEach(layer, ofType, (elem, elemLayer) -> { elem.invokeAll(elemLayer, ofType, consumer); return null; @@ -87,6 +87,7 @@ default boolean invokeHandlers(int layer, Class ofType, Function> { Minecraft getMinecraft(); GuiContainer getContainer(); + T setContainer(GuiContainer container); void layout(ReadableDimension size, RenderInfo renderInfo); + void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo); ReadableDimension getMinSize(); + ReadableDimension getMaxSize(); T setMaxSize(ReadableDimension maxSize); boolean isEnabled(); + T setEnabled(boolean enabled); + T setEnabled(); + T setDisabled(); GuiElement getTooltip(RenderInfo renderInfo); + T setTooltip(GuiElement tooltip); /** * Returns the layer this element takes part in. * The standard layer is layer 0. Event handlers will be called for this layer. + * * @return The layer of this element */ int getLayer(); diff --git a/src/main/java/com/replaymod/gui/element/IGuiButton.java b/src/main/java/com/replaymod/gui/element/IGuiButton.java index d6b5c6b1..d98a5e90 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiButton.java +++ b/src/main/java/com/replaymod/gui/element/IGuiButton.java @@ -29,30 +29,29 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import net.minecraft.util.ResourceLocation; - -//#if MC>=10904 import net.minecraft.util.SoundEvent; -//#endif public interface IGuiButton> extends IGuiClickable { T setLabel(String label); T setI18nLabel(String label, Object... args); - //#if MC>=10904 T setSound(SoundEvent sound); - //#endif String getLabel(); ResourceLocation getTexture(); + T setTexture(ResourceLocation identifier); ReadableDimension getTextureSize(); + T setTextureSize(ReadableDimension size); + default T setTextureSize(int width, int height) { return setTextureSize(new Dimension(width, height)); } + default T setTextureSize(int size) { return setTextureSize(size, size); } @@ -60,18 +59,23 @@ default T setTextureSize(int size) { default T setTexture(ResourceLocation identifier, int width, int height) { return setTexture(identifier).setTextureSize(width, height); } + default T setTexture(ResourceLocation resourceLocation, int size) { return setTexture(resourceLocation, size, size); } T setSpriteUV(ReadablePoint uv); + ReadablePoint getSpriteUV(); + default T setSpriteUV(int u, int v) { return setSpriteUV(new Point(u, v)); } T setSpriteSize(ReadableDimension size); + ReadableDimension getSpriteSize(); + default T setSpriteSize(int width, int height) { return setSpriteSize(new Dimension(width, height)); } diff --git a/src/main/java/com/replaymod/gui/element/IGuiClickable.java b/src/main/java/com/replaymod/gui/element/IGuiClickable.java index 7166c4e9..68d92c5b 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiClickable.java +++ b/src/main/java/com/replaymod/gui/element/IGuiClickable.java @@ -26,5 +26,6 @@ public interface IGuiClickable> extends GuiElement { T onClick(Runnable onClick); + Runnable getOnClick(); } diff --git a/src/main/java/com/replaymod/gui/element/IGuiHorizontalScrollbar.java b/src/main/java/com/replaymod/gui/element/IGuiHorizontalScrollbar.java index ab79984d..fd138cc7 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiHorizontalScrollbar.java +++ b/src/main/java/com/replaymod/gui/element/IGuiHorizontalScrollbar.java @@ -27,6 +27,7 @@ public interface IGuiHorizontalScrollbar> extends GuiElement { /** * Set the position of the scrollbar. + * * @param pos Position between 0 (inclusive) and 1-zoom (inclusive) * @return {@code this}, for chaining */ @@ -34,6 +35,7 @@ public interface IGuiHorizontalScrollbar> e /** * Returns the position of the scrollbar. + * * @return Position between 0 (inclusive) and 1-zoom (inclusive) */ double getPosition(); @@ -41,6 +43,7 @@ public interface IGuiHorizontalScrollbar> e /** * Set the zoom of the scrollbar where 1 is zoomed out completely * and 0 would be zoomed in infinitely far. + * * @param zoom Zoom between 1 (inclusive) and 0 (exclusive) * @return {@code this}, for chaining */ @@ -49,12 +52,14 @@ public interface IGuiHorizontalScrollbar> e /** * Returns the zoom of the scrollbar where 1 is zoomed out completely * and 0 would be zoomed in infinitely far. + * * @return Zoom between 1 (inclusive) and 0 (exclusive) */ double getZoom(); /** * Sets the runnable called when the position or zoom of the scrollbar changed. + * * @param runnable The Runnable to be called * @return {@code this}, for chaining */ diff --git a/src/main/java/com/replaymod/gui/element/IGuiImage.java b/src/main/java/com/replaymod/gui/element/IGuiImage.java index 8d7c2ac9..3e10eb7b 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiImage.java +++ b/src/main/java/com/replaymod/gui/element/IGuiImage.java @@ -29,14 +29,20 @@ public interface IGuiImage> extends GuiElement { T setTexture(Image img); + T setTexture(ResourceLocation resourceLocation); + T setTexture(ResourceLocation resourceLocation, int u, int v, int width, int height); T setU(int u); + T setV(int v); + T setUV(int u, int v); T setUWidth(int width); + T setVHeight(int height); + T setUVSize(int width, int height); } diff --git a/src/main/java/com/replaymod/gui/element/IGuiNumberField.java b/src/main/java/com/replaymod/gui/element/IGuiNumberField.java index e1f667dc..47f87d5c 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiNumberField.java +++ b/src/main/java/com/replaymod/gui/element/IGuiNumberField.java @@ -26,19 +26,27 @@ public interface IGuiNumberField> extends IGuiTextField { byte getByte(); + short getShort(); + int getInteger(); + long getLong(); + float getFloat(); + double getDouble(); T setValue(int value); + T setValue(double value); T setMinValue(Double minValue); + T setMaxValue(Double maxValue); T setMinValue(int minValue); + T setMaxValue(int maxValue); T setValidateOnFocusChange(boolean validateOnFocusChange); @@ -47,6 +55,7 @@ public interface IGuiNumberField> extends IGuiTextF * Sets the amount of digits allowed after the decimal point. * A value of {@code 0} is equal to integer precision. * Negative values are not allowed. + * * @param precision Number of digits allowed */ T setPrecision(int precision); diff --git a/src/main/java/com/replaymod/gui/element/IGuiSlider.java b/src/main/java/com/replaymod/gui/element/IGuiSlider.java index b301f493..2571bda2 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiSlider.java +++ b/src/main/java/com/replaymod/gui/element/IGuiSlider.java @@ -26,12 +26,15 @@ public interface IGuiSlider> extends GuiElement { T setText(String text); + T setI18nText(String text, Object... args); T setValue(int value); + int getValue(); int getSteps(); + T setSteps(int steps); T onValueChanged(Runnable runnable); diff --git a/src/main/java/com/replaymod/gui/element/IGuiTextField.java b/src/main/java/com/replaymod/gui/element/IGuiTextField.java index e2251941..c0a69540 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiTextField.java +++ b/src/main/java/com/replaymod/gui/element/IGuiTextField.java @@ -34,29 +34,36 @@ public interface IGuiTextField> extends GuiElement * Set the text to the specified string. * If the string is longer than {@link #getMaxLength()} it is truncated from the end. * This method positions the cursor at the end of the text and removes any selections. + * * @param text The new text * @return {@code this} for chaining */ - @NonNull T setText(String text); + @NonNull + T setText(String text); /** * Set the text to the specified string. * If the string is longer than {@link #getMaxLength()} it is truncated from the end. * This method positions the cursor at the end of the text and removes any selections. + * * @param text The language key for the new text * @param args The arguments used in translating the language key * @return {@code this} for chaining */ - @NonNull T setI18nText(String text, Object... args); + @NonNull + T setI18nText(String text, Object... args); /** * Return the whole text in this text field. + * * @return The text, may be empty */ - @NonNull String getText(); + @NonNull + String getText(); /** * Return the maximum allowed length of the text in this text field. + * * @return Maximum number of characters */ int getMaxLength(); @@ -65,6 +72,7 @@ public interface IGuiTextField> extends GuiElement * Set the maximum allowed length of the text in this text field. * If the current test is longer than the new limit, it is truncated from the end (the cursor and selection * are reset in that process, see {@link #setText(String)}). + * * @param maxLength Maximum number of characters * @return {@code this} for chaining * @throws IllegalArgumentException When {@code maxLength} is negative @@ -73,57 +81,70 @@ public interface IGuiTextField> extends GuiElement /** * Deletes the text between {@code from} and {@code to} (inclusive). + * * @param from Index at which to start - * @param to Index to which to delete + * @param to Index to which to delete * @return The deleted text * @throws IllegalArgumentException If {@code from} is greater than {@code to} or either is out of bounds */ - @NonNull String deleteText(int from, int to); + @NonNull + String deleteText(int from, int to); /** * Return the index at which the selection starts (inclusive) + * * @return Index of first character */ int getSelectionFrom(); /** * Return the index at which the selection ends (exclusive) + * * @return Index after the last character */ int getSelectionTo(); /** * Return the selected text. + * * @return The selected text */ - @NonNull String getSelectedText(); + @NonNull + String getSelectedText(); /** * Delete the selected text. Positions the cursor at the beginning of the selection and clears the selection. + * * @return The deleted text */ - @NonNull String deleteSelectedText(); + @NonNull + String deleteSelectedText(); /** * Appends the specified string to this text field character by character. * Excess characters are ignored. + * * @param append String to append * @return {@code this} for chaining * @see #writeChar(char) */ - @NonNull T writeText(String append); + @NonNull + T writeText(String append); /** * Appends the specified character to this text field replacing the current selection (if any). * This does nothing if the maximum character limit is reached. + * * @param c Character to append * @return {@code this} for chaining */ - @NonNull T writeChar(char c); + @NonNull + T writeChar(char c); /** * Delete the nex character (if any). * Clears the selection. + * * @return {@code this} for chaining */ T deleteNextChar(); @@ -131,39 +152,52 @@ public interface IGuiTextField> extends GuiElement /** * Delete everything from the cursor (inclusive) to the beginning of the next word (exclusive). * If there are no more words, delete everything until the end of the line. + * * @return The deleted text */ String deleteNextWord(); /** * Delete the previous character (if any). + * * @return {@code this} for chaining */ - @NonNull T deletePreviousChar(); + @NonNull + T deletePreviousChar(); /** * Delete everything from cursor to the first character of the previous word (or the start of the line). + * * @return The deleted text */ - @NonNull String deletePreviousWord(); + @NonNull + String deletePreviousWord(); /** * Set the cursor position. + * * @param pos Position of the cursor * @return {@code this} for chaining * @throws IllegalArgumentException If {@code pos} < 0 or pos > length */ - @NonNull T setCursorPosition(int pos); + @NonNull + T setCursorPosition(int pos); T onEnter(Runnable onEnter); + T onTextChanged(Consumer textChanged); String getHint(); + T setHint(String hint); + T setI18nHint(String hint, Object... args); ReadableColor getTextColor(); + T setTextColor(ReadableColor textColor); + ReadableColor getTextColorDisabled(); + T setTextColorDisabled(ReadableColor textColorDisabled); } diff --git a/src/main/java/com/replaymod/gui/element/IGuiTexturedButton.java b/src/main/java/com/replaymod/gui/element/IGuiTexturedButton.java index 96f830c4..3da37920 100644 --- a/src/main/java/com/replaymod/gui/element/IGuiTexturedButton.java +++ b/src/main/java/com/replaymod/gui/element/IGuiTexturedButton.java @@ -27,33 +27,44 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import net.minecraft.util.ResourceLocation; -//#if MC>=10904 import net.minecraft.util.SoundEvent; -//#endif public interface IGuiTexturedButton> extends IGuiClickable { ResourceLocation getTexture(); + ReadableDimension getTextureTotalSize(); + T setTexture(ResourceLocation resourceLocation, int size); + T setTexture(ResourceLocation resourceLocation, int width, int height); ReadableDimension getTextureSize(); + T setTextureSize(int size); + T setTextureSize(int width, int height); ReadablePoint getTextureNormal(); + ReadablePoint getTextureHover(); + ReadablePoint getTextureDisabled(); + T setTexturePosH(int x, int y); + T setTexturePosV(int x, int y); + T setTexturePosH(ReadablePoint pos); + T setTexturePosV(ReadablePoint pos); + T setTexturePos(int normalX, int normalY, int hoverX, int hoverY); + T setTexturePos(ReadablePoint normal, ReadablePoint hover); + T setTexturePos(int normalX, int normalY, int hoverX, int hoverY, int disabledX, int disabledY); + T setTexturePos(ReadablePoint normal, ReadablePoint hover, ReadablePoint disabled); - //#if MC>=10904 T setSound(SoundEvent sound); - //#endif } diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiColorPicker.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiColorPicker.java index 31879336..07c81041 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiColorPicker.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiColorPicker.java @@ -24,22 +24,17 @@ */ package com.replaymod.gui.element.advanced; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.OffsetGuiRenderer; +import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.element.AbstractComposedGuiElement; import com.replaymod.gui.element.AbstractGuiElement; import com.replaymod.gui.element.GuiElement; import com.replaymod.gui.function.Clickable; import com.replaymod.gui.function.Draggable; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.OffsetGuiRenderer; -import com.replaymod.gui.RenderInfo; import com.replaymod.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; +import de.johni0702.minecraft.gui.utils.lwjgl.*; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiDropdownMenu.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiDropdownMenu.java index 32ca22df..2efa247e 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiDropdownMenu.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiDropdownMenu.java @@ -24,25 +24,20 @@ */ package com.replaymod.gui.element.advanced; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.OffsetGuiRenderer; +import com.replaymod.gui.RenderInfo; +import com.replaymod.gui.container.GuiContainer; +import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.element.AbstractComposedGuiElement; import com.replaymod.gui.element.AbstractGuiClickable; import com.replaymod.gui.element.GuiElement; import com.replaymod.gui.element.IGuiClickable; import com.replaymod.gui.function.Clickable; import com.replaymod.gui.layout.VerticalLayout; -import com.replaymod.gui.versions.MCVer; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.OffsetGuiRenderer; -import com.replaymod.gui.RenderInfo; -import com.replaymod.gui.container.GuiContainer; -import com.replaymod.gui.container.GuiPanel; import com.replaymod.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; +import com.replaymod.gui.versions.MCVer; +import de.johni0702.minecraft.gui.utils.lwjgl.*; import net.minecraft.client.gui.FontRenderer; import java.util.Collection; @@ -52,7 +47,7 @@ import java.util.function.Function; public abstract class AbstractGuiDropdownMenu> - extends AbstractComposedGuiElement implements IGuiDropdownMenu, Clickable { + extends AbstractComposedGuiElement implements IGuiDropdownMenu, Clickable { private static final ReadableColor OUTLINE_COLOR = new Color(160, 160, 160); private int selected; @@ -100,7 +95,7 @@ public void layout(ReadableDimension size, RenderInfo renderInfo) { FontRenderer fontRenderer = com.replaymod.gui.versions.MCVer.getFontRenderer(); if (renderInfo.layer == 1) { ReadablePoint offsetPoint = new Point(0, size.getHeight()); - ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.FONT_HEIGHT + 5) * values.length); + ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.FONT_HEIGHT + 5) * values.length); dropdown.layout(offsetSize, renderInfo.offsetMouse(0, offsetPoint.getY()).layer(0)); } } @@ -130,7 +125,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render renderer.drawString(3, height / 2 - fontRenderer.FONT_HEIGHT / 2, ReadableColor.WHITE, toString.apply(getSelectedValue())); } else if (renderInfo.layer == 1) { ReadablePoint offsetPoint = new Point(0, size.getHeight()); - ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.FONT_HEIGHT + 5) * values.length); + ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.FONT_HEIGHT + 5) * values.length); OffsetGuiRenderer offsetRenderer = new OffsetGuiRenderer(renderer, offsetPoint, offsetSize); offsetRenderer.startUsing(); try { @@ -144,7 +139,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render @Override public T setValues(V... values) { this.values = values; - dropdown = new GuiPanel(){ + dropdown = new GuiPanel() { @Override public void convertFor(com.replaymod.gui.element.GuiElement element, Point point, int relativeLayer) { AbstractGuiDropdownMenu parent = AbstractGuiDropdownMenu.this; diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiProgressBar.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiProgressBar.java index 38fb5ab2..c03be1c9 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiProgressBar.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiProgressBar.java @@ -24,11 +24,11 @@ */ package com.replaymod.gui.element.advanced; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.element.AbstractGuiElement; import com.replaymod.gui.versions.MCVer; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.RenderInfo; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; @@ -80,7 +80,7 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render renderer.drawRect(BORDER, BORDER, barTotalWidth, height - 2 * BORDER, ReadableColor.WHITE); // Background renderer.drawRect(BORDER, BORDER, barDoneWidth, height - 2 * BORDER, ReadableColor.GREY); // Progress - String text = String.format(label, (int)(progress * 100)); + String text = String.format(label, (int) (progress * 100)); renderer.drawCenteredString(width / 2, size.getHeight() / 2 - fontRenderer.FONT_HEIGHT / 2, ReadableColor.BLACK, text); } diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiResourceLoadingList.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiResourceLoadingList.java index be066495..005d8694 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiResourceLoadingList.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiResourceLoadingList.java @@ -24,6 +24,8 @@ */ package com.replaymod.gui.element.advanced; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.AbstractGuiVerticalList; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.container.GuiPanel; @@ -32,8 +34,6 @@ import com.replaymod.gui.function.*; import com.replaymod.gui.layout.CustomLayout; import com.replaymod.gui.layout.VerticalLayout; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.RenderInfo; import com.replaymod.gui.utils.Colors; import com.replaymod.gui.utils.Consumer; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; @@ -50,11 +50,6 @@ import static com.replaymod.gui.utils.Utils.DOUBLE_CLICK_INTERVAL; -//#if MC>=11400 - -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif public abstract class AbstractGuiResourceLoadingList , U extends com.replaymod.gui.element.GuiElement & Comparable> diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTextArea.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTextArea.java index b38d84f7..07d42adc 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTextArea.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTextArea.java @@ -24,31 +24,20 @@ */ package com.replaymod.gui.element.advanced; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.RenderInfo; +import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.element.AbstractGuiElement; import com.replaymod.gui.function.Clickable; import com.replaymod.gui.function.Focusable; import com.replaymod.gui.function.Tickable; import com.replaymod.gui.function.Typeable; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.RenderInfo; -import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.utils.Consumer; -import de.johni0702.minecraft.gui.utils.lwjgl.Color; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; +import de.johni0702.minecraft.gui.utils.lwjgl.*; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.resources.I18n; - -//#if MC>=11400 import net.minecraft.util.SharedConstants; -//#else -//$$ import net.minecraft.util.ChatAllowedCharacters; -//$$ import org.lwjgl.input.Keyboard; -//#endif import java.util.Arrays; @@ -227,20 +216,16 @@ public void writeText(String append) { @Override public void writeChar(char c) { - //#if MC>=11400 if (!SharedConstants.isAllowedCharacter(c)) { - //#else - //$$ if (!ChatAllowedCharacters.isAllowedCharacter(c)) { - //#endif return; } int totalCharCount = 0; - for(String line : text) { + for (String line : text) { totalCharCount += line.length(); } - if(maxCharCount > 0 && totalCharCount-(getSelectedText().length()) >= maxCharCount) { + if (maxCharCount > 0 && totalCharCount - (getSelectedText().length()) >= maxCharCount) { return; } diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimeline.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimeline.java index a2bc3e5f..347b2b9a 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimeline.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimeline.java @@ -24,19 +24,15 @@ */ package com.replaymod.gui.element.advanced; +import com.replaymod.gui.GuiRenderer; +import com.replaymod.gui.RenderInfo; import com.replaymod.gui.container.GuiContainer; import com.replaymod.gui.element.AbstractGuiElement; import com.replaymod.gui.element.GuiTooltip; import com.replaymod.gui.function.Clickable; -import com.replaymod.gui.GuiRenderer; -import com.replaymod.gui.RenderInfo; import com.replaymod.gui.utils.Colors; import com.replaymod.gui.utils.Utils; -import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; -import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; +import de.johni0702.minecraft.gui.utils.lwjgl.*; import static com.replaymod.gui.utils.Utils.clamp; @@ -77,7 +73,7 @@ public AbstractGuiTimeline(GuiContainer container) { } { - setTooltip(new GuiTooltip(){ + setTooltip(new GuiTooltip() { @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { setText(getTooltipText(renderInfo)); @@ -119,8 +115,9 @@ public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo render * Draws the timeline cursor. * This is separate from the main draw method so subclasses can repaint the cursor * in case it got drawn over by other elements. + * * @param renderer Gui renderer used to draw the cursor - * @param size Size of the drawable area + * @param size Size of the drawable area */ protected void drawTimelineCursor(GuiRenderer renderer, ReadableDimension size) { if (!drawCursor) return; @@ -167,6 +164,7 @@ protected void drawMarker(GuiRenderer renderer, ReadableDimension size, int time /** * Returns the time which the mouse is at. + * * @param mouseX X coordinate of the mouse * @param mouseY Y coordinate of the mouse * @return The time or -1 if the mouse isn't on the timeline @@ -188,7 +186,7 @@ protected int getTimeAt(int mouseX, int mouseY) { int width = size.getWidth(); int bodyWidth = width - BORDER_LEFT - BORDER_RIGHT; double segmentLength = length * zoom; - double segmentTime = segmentLength * (mouseX - BORDER_LEFT) / bodyWidth; + double segmentTime = segmentLength * (mouseX - BORDER_LEFT) / bodyWidth; return Math.min(Math.max((int) Math.round(offset + segmentTime), 0), length); } @@ -310,9 +308,9 @@ public int getMarkerInterval() { int maxMarkers = width / markerMinDistance; // Max. amount of markers that can fit in the timeline int minInterval = (int) (segmentLength / maxMarkers); // Min. interval between those markers final int S = 1000; - final int M = 60*S; - final int H = 60*M; - final int[] snapTo = {S, 2*S, 5*S, 10*S, 15*S, 20*S, 30*S, M, 2*M, 5*M, 10*M, 15*M, 30*M, H, 2*H, 5*H, 10*H}; + final int M = 60 * S; + final int H = 60 * M; + final int[] snapTo = {S, 2 * S, 5 * S, 10 * S, 15 * S, 20 * S, 30 * S, M, 2 * M, 5 * M, 10 * M, 15 * M, 30 * M, H, 2 * H, 5 * H, 10 * H}; // Find next greater snap for (int snap : snapTo) { if (snap > minInterval) { diff --git a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimelineTime.java b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimelineTime.java index 8e3952c0..f59dbcbf 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimelineTime.java +++ b/src/main/java/com/replaymod/gui/element/advanced/AbstractGuiTimelineTime.java @@ -24,12 +24,12 @@ */ package com.replaymod.gui.element.advanced; -import com.replaymod.gui.container.GuiContainer; -import com.replaymod.gui.element.AbstractGuiElement; -import com.replaymod.gui.versions.MCVer; import com.replaymod.gui.GuiRenderer; import com.replaymod.gui.RenderInfo; +import com.replaymod.gui.container.GuiContainer; +import com.replaymod.gui.element.AbstractGuiElement; import com.replaymod.gui.utils.Colors; +import com.replaymod.gui.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; diff --git a/src/main/java/com/replaymod/gui/element/advanced/GuiResourceLoadingList.java b/src/main/java/com/replaymod/gui/element/advanced/GuiResourceLoadingList.java index 6857143f..689e59c1 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/GuiResourceLoadingList.java +++ b/src/main/java/com/replaymod/gui/element/advanced/GuiResourceLoadingList.java @@ -24,8 +24,8 @@ */ package com.replaymod.gui.element.advanced; -import com.replaymod.gui.element.GuiElement; import com.replaymod.gui.container.GuiContainer; +import com.replaymod.gui.element.GuiElement; public class GuiResourceLoadingList & Comparable> extends AbstractGuiResourceLoadingList, U> { diff --git a/src/main/java/com/replaymod/gui/element/advanced/IGuiDropdownMenu.java b/src/main/java/com/replaymod/gui/element/advanced/IGuiDropdownMenu.java index 27a8508a..6c4bc701 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/IGuiDropdownMenu.java +++ b/src/main/java/com/replaymod/gui/element/advanced/IGuiDropdownMenu.java @@ -56,6 +56,7 @@ public interface IGuiDropdownMenu> extends G * The returned map is only valid until {@link #setValues(Object[])} is * called, at which point new GUI elements are created.
* This may return null if {@link #setValues(Object[])} has not yet been called. + * * @return Unmodifiable, ordered map of entries */ Map getDropdownEntries(); @@ -63,6 +64,7 @@ public interface IGuiDropdownMenu> extends G /** * Set the function used to convert the values to display strings. * If not set, {@code Object::toString} is used. + * * @param toString Function used to convert * @return {@code this}, for chaining */ diff --git a/src/main/java/com/replaymod/gui/element/advanced/IGuiTextArea.java b/src/main/java/com/replaymod/gui/element/advanced/IGuiTextArea.java index e8e049c6..c3eb6d0f 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/IGuiTextArea.java +++ b/src/main/java/com/replaymod/gui/element/advanced/IGuiTextArea.java @@ -72,6 +72,8 @@ public interface IGuiTextArea> extends GuiElement, int getMaxCharCount(); String[] getHint(); + T setHint(String... hint); + T setI18nHint(String hint, Object... args); } diff --git a/src/main/java/com/replaymod/gui/element/advanced/IGuiTimeline.java b/src/main/java/com/replaymod/gui/element/advanced/IGuiTimeline.java index 6e4c71cf..095e1990 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/IGuiTimeline.java +++ b/src/main/java/com/replaymod/gui/element/advanced/IGuiTimeline.java @@ -30,6 +30,7 @@ public interface IGuiTimeline> extends GuiElement { /** * Set the total length of the timeline. + * * @param length length in milliseconds, must be > 0 * @return {@code this}, for chaining */ @@ -37,12 +38,14 @@ public interface IGuiTimeline> extends GuiElement { /** * Returns the total length of the timeline. + * * @return The total length in millisconds */ int getLength(); /** * Set the current position of the cursor. Should be between 0 and {@link #getLength()}. + * * @param position Position of the cursor in milliseconds * @return {@code this}, for chaining */ @@ -50,12 +53,14 @@ public interface IGuiTimeline> extends GuiElement { /** * Returns the current position of the cursor. Should be between 0 and {@link #getLength()}. + * * @return cursor position in milliseconds */ int getCursorPosition(); /** * Set the zoom of this timeline. 1/10 allows the user to see 1/10 of the total length. + * * @param zoom The zoom factor. Must be between 1 (inclusive) and 0 (exclusive) * @return {@code this}, for chaining */ @@ -63,6 +68,7 @@ public interface IGuiTimeline> extends GuiElement { /** * Returns the zoom of this timeline. 1/10 allows the user to see 1/10 of the total length. + * * @return The zoom factor. Must be between 1 (inclusive) and 0 (exclusive) */ double getZoom(); @@ -70,6 +76,7 @@ public interface IGuiTimeline> extends GuiElement { /** * Set the position of the timeline which should be shown. * The left side of the timeline will start at this offset. + * * @param offset The offset in milliseconds * @return {@code this}, for chaining */ @@ -78,6 +85,7 @@ public interface IGuiTimeline> extends GuiElement { /** * Returns the position of the timeline which should be shown. * The left side of the timeline will start at this offset. + * * @return The offset in milliseconds */ int getOffset(); @@ -85,6 +93,7 @@ public interface IGuiTimeline> extends GuiElement { /** * Enables makers for this timeline. * Markers are drawn in regular intervals and between each big marker there are three small ones. + * * @return {@code this}, for chaining */ T setMarkers(); @@ -92,6 +101,7 @@ public interface IGuiTimeline> extends GuiElement { /** * Set whether markers should be drawn on this timeline. * Markers are drawn in regular intervals and between each big marker there are three small ones. + * * @param active {@code true} to enable drawing of markers, {@code false} to disable it * @return {@code this}, for chaining */ @@ -100,6 +110,7 @@ public interface IGuiTimeline> extends GuiElement { /** * Returns whether markers are drawn on this timeline. * Markers are drawn in regular intervals and between each big marker there are three small ones. + * * @return {@code true} if markers are drawn, {@code false} otherwise */ boolean getMarkers(); @@ -107,12 +118,14 @@ public interface IGuiTimeline> extends GuiElement { /** * Returns the interval at which big markers are draw on the timeline. * There are three small markers between each pair of big markers. + * * @return Interval in milliseconds */ int getMarkerInterval(); /** * Set whether the cursor should be drawn on this timeline. + * * @param active {@code true} to enable drawing of the cursor, {@code false} otherwise * @return {@code this}, for chaining */ @@ -120,6 +133,7 @@ public interface IGuiTimeline> extends GuiElement { /** * Returns whether the cursor is drawn on this timeline. + * * @return {@code true} if the cursor is drawn, {@code false} otherwise */ boolean getCursor(); diff --git a/src/main/java/com/replaymod/gui/element/advanced/IGuiTimelineTime.java b/src/main/java/com/replaymod/gui/element/advanced/IGuiTimelineTime.java index c0066a3e..d1eaacd5 100644 --- a/src/main/java/com/replaymod/gui/element/advanced/IGuiTimelineTime.java +++ b/src/main/java/com/replaymod/gui/element/advanced/IGuiTimelineTime.java @@ -36,12 +36,14 @@ public interface IGuiTimelineTime, U extends IGuiTimeline> extends GuiElement { /** * Returns the timeline of which the time is drawn. + * * @return The timeline or {@code null} if not yet set */ U getTimeline(); /** * Set the timeline of which the time should be drawn. + * * @param timeline The timeline * @return {@code this}, for chaining */ diff --git a/src/main/java/com/replaymod/gui/function/Draggable.java b/src/main/java/com/replaymod/gui/function/Draggable.java index e20bc581..aec8fdc6 100644 --- a/src/main/java/com/replaymod/gui/function/Draggable.java +++ b/src/main/java/com/replaymod/gui/function/Draggable.java @@ -28,5 +28,6 @@ public interface Draggable extends Clickable { boolean mouseDrag(ReadablePoint position, int button, @Deprecated long timeSinceLastCall); + boolean mouseRelease(ReadablePoint position, int button); } diff --git a/src/main/java/com/replaymod/gui/function/Focusable.java b/src/main/java/com/replaymod/gui/function/Focusable.java index 16400a15..eae3311c 100644 --- a/src/main/java/com/replaymod/gui/function/Focusable.java +++ b/src/main/java/com/replaymod/gui/function/Focusable.java @@ -29,14 +29,17 @@ public interface Focusable> { boolean isFocused(); + T setFocused(boolean focused); T onFocusChange(Consumer consumer); Focusable getNext(); + T setNext(Focusable next); Focusable getPrevious(); + T setPrevious(Focusable previous); } diff --git a/src/main/java/com/replaymod/gui/function/Scrollable.java b/src/main/java/com/replaymod/gui/function/Scrollable.java index cb07c257..3c67e52d 100644 --- a/src/main/java/com/replaymod/gui/function/Scrollable.java +++ b/src/main/java/com/replaymod/gui/function/Scrollable.java @@ -29,10 +29,11 @@ public interface Scrollable { /** * Called when the user scrolled. + * * @param mousePosition Global position of the mouse. - * @param dWheel Wheel movement (positive is upwards, negative is downwards) + * @param dWheel Wheel movement (positive is upwards, negative is downwards) * @return {@code true} if this event should be consumed, - * {@code false} if it should be delivered to other elements as well + * {@code false} if it should be delivered to other elements as well */ boolean scroll(ReadablePoint mousePosition, int dWheel); } diff --git a/src/main/java/com/replaymod/gui/layout/GridLayout.java b/src/main/java/com/replaymod/gui/layout/GridLayout.java index 949d2512..6685cc72 100644 --- a/src/main/java/com/replaymod/gui/layout/GridLayout.java +++ b/src/main/java/com/replaymod/gui/layout/GridLayout.java @@ -33,11 +33,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import org.apache.commons.lang3.tuple.Pair; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Objects; +import java.util.*; public class GridLayout implements Layout { private static final Data DEFAULT_DATA = new Data(); @@ -61,7 +57,7 @@ public Map> layOut(GuiContain Pair maxCellSize = null; - if(!cellsEqualSize) { + if (!cellsEqualSize) { maxCellSize = calcNeededCellSize(container); } @@ -93,7 +89,7 @@ public Map> layOut(GuiContain } Map.Entry entry = iter.next(); - GuiElement element = entry.getKey(); + GuiElement element = entry.getKey(); Data data = entry.getValue() instanceof Data ? (Data) entry.getValue() : DEFAULT_DATA; Dimension elementSize = new Dimension(element.getMinSize()); ReadableDimension elementMaxSize = element.getMaxSize(); @@ -151,10 +147,10 @@ public ReadableDimension calcMinSize(GuiContainer container) { } if (elements > 0) { - totalWidth+=spacingX * (columns - 1); + totalWidth += spacingX * (columns - 1); } if (elements > columns) { - totalHeight+=spacingY * (rows - 1); + totalHeight += spacingY * (rows - 1); } return new Dimension(totalWidth, totalHeight); } diff --git a/src/main/java/com/replaymod/gui/layout/HorizontalLayout.java b/src/main/java/com/replaymod/gui/layout/HorizontalLayout.java index 71feeb2a..1b856ace 100644 --- a/src/main/java/com/replaymod/gui/layout/HorizontalLayout.java +++ b/src/main/java/com/replaymod/gui/layout/HorizontalLayout.java @@ -60,7 +60,7 @@ public Map> layOut(GuiContain x += spacing; spacing = this.spacing; - GuiElement element = entry.getKey(); + GuiElement element = entry.getKey(); Data data = entry.getValue() instanceof Data ? (Data) entry.getValue() : DEFAULT_DATA; Dimension elementSize = new Dimension(element.getMinSize()); ReadableDimension elementMaxSize = element.getMaxSize(); diff --git a/src/main/java/com/replaymod/gui/layout/VerticalLayout.java b/src/main/java/com/replaymod/gui/layout/VerticalLayout.java index fde41069..e66d6d1e 100644 --- a/src/main/java/com/replaymod/gui/layout/VerticalLayout.java +++ b/src/main/java/com/replaymod/gui/layout/VerticalLayout.java @@ -60,7 +60,7 @@ public Map> layOut(GuiContain y += spacing; spacing = this.spacing; - GuiElement element = entry.getKey(); + GuiElement element = entry.getKey(); Data data = entry.getValue() instanceof Data ? (Data) entry.getValue() : DEFAULT_DATA; Dimension elementSize = new Dimension(element.getMinSize()); ReadableDimension elementMaxSize = element.getMaxSize(); diff --git a/src/main/java/com/replaymod/gui/popup/AbstractGuiPopup.java b/src/main/java/com/replaymod/gui/popup/AbstractGuiPopup.java index 4c0e5710..d69ca8aa 100644 --- a/src/main/java/com/replaymod/gui/popup/AbstractGuiPopup.java +++ b/src/main/java/com/replaymod/gui/popup/AbstractGuiPopup.java @@ -38,7 +38,7 @@ import java.util.function.Function; public abstract class AbstractGuiPopup> extends AbstractGuiContainer { - private final com.replaymod.gui.container.GuiPanel popupContainer = new com.replaymod.gui.container.GuiPanel(this){ + private final com.replaymod.gui.container.GuiPanel popupContainer = new com.replaymod.gui.container.GuiPanel(this) { private final int u0 = 0; private final int v0 = 39; diff --git a/src/main/java/com/replaymod/gui/popup/GuiFileChooserPopup.java b/src/main/java/com/replaymod/gui/popup/GuiFileChooserPopup.java index e62ce780..f8805521 100644 --- a/src/main/java/com/replaymod/gui/popup/GuiFileChooserPopup.java +++ b/src/main/java/com/replaymod/gui/popup/GuiFileChooserPopup.java @@ -49,29 +49,26 @@ import java.nio.file.InvalidPathException; import java.util.*; -//#if MC>=11400 - -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif public class GuiFileChooserPopup extends AbstractGuiPopup implements Typeable { - public static GuiFileChooserPopup openSaveGui(com.replaymod.gui.container.GuiContainer container, String buttonLabel, String...fileExtensions) { + public static GuiFileChooserPopup openSaveGui(com.replaymod.gui.container.GuiContainer container, String buttonLabel, String... fileExtensions) { GuiFileChooserPopup popup = new GuiFileChooserPopup(container, fileExtensions, false).setBackgroundColor(com.replaymod.gui.utils.Colors.DARK_TRANSPARENT); popup.acceptButton.setI18nLabel(buttonLabel); popup.open(); return popup; } - public static GuiFileChooserPopup openLoadGui(com.replaymod.gui.container.GuiContainer container, String buttonLabel, String...fileExtensions) { + public static GuiFileChooserPopup openLoadGui(com.replaymod.gui.container.GuiContainer container, String buttonLabel, String... fileExtensions) { GuiFileChooserPopup popup = new GuiFileChooserPopup(container, fileExtensions, true).setBackgroundColor(Colors.DARK_TRANSPARENT); popup.acceptButton.setI18nLabel(buttonLabel).setDisabled(); popup.open(); return popup; } - private com.replaymod.gui.utils.Consumer onAccept = (file) -> {}; - private Runnable onCancel = () -> {}; + private com.replaymod.gui.utils.Consumer onAccept = (file) -> { + }; + private Runnable onCancel = () -> { + }; private final com.replaymod.gui.container.GuiScrollable pathScrollable = new GuiScrollable(popup) { @Override diff --git a/src/main/java/com/replaymod/gui/popup/GuiInfoPopup.java b/src/main/java/com/replaymod/gui/popup/GuiInfoPopup.java index c061d278..f98a093f 100644 --- a/src/main/java/com/replaymod/gui/popup/GuiInfoPopup.java +++ b/src/main/java/com/replaymod/gui/popup/GuiInfoPopup.java @@ -36,14 +36,9 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -//#if MC>=11400 - -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif public class GuiInfoPopup extends AbstractGuiPopup implements Typeable { - public static GuiInfoPopup open(com.replaymod.gui.container.GuiContainer container, String...info) { + public static GuiInfoPopup open(com.replaymod.gui.container.GuiContainer container, String... info) { com.replaymod.gui.element.GuiElement[] labels = new com.replaymod.gui.element.GuiElement[info.length]; for (int i = 0; i < info.length; i++) { labels[i] = new GuiLabel().setI18nText(info[i]).setColor(com.replaymod.gui.utils.Colors.BLACK); @@ -58,7 +53,8 @@ public static GuiInfoPopup open(com.replaymod.gui.container.GuiContainer contain return popup; } - private Runnable onClosed = () -> {}; + private Runnable onClosed = () -> { + }; private final com.replaymod.gui.element.GuiButton closeButton = new com.replaymod.gui.element.GuiButton().setSize(150, 20).onClick(() -> { close(); @@ -84,7 +80,7 @@ public GuiInfoPopup setCloseLabel(String label) { return this; } - public GuiInfoPopup setCloseI18nLabel(String label, Object...args) { + public GuiInfoPopup setCloseI18nLabel(String label, Object... args) { closeButton.setI18nLabel(label, args); return this; } diff --git a/src/main/java/com/replaymod/gui/popup/GuiYesNoPopup.java b/src/main/java/com/replaymod/gui/popup/GuiYesNoPopup.java index 1ced14eb..3e2e1bb2 100644 --- a/src/main/java/com/replaymod/gui/popup/GuiYesNoPopup.java +++ b/src/main/java/com/replaymod/gui/popup/GuiYesNoPopup.java @@ -36,11 +36,6 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; -//#if MC>=11400 -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif - import java.util.function.Consumer; public class GuiYesNoPopup extends AbstractGuiPopup implements Typeable { @@ -51,9 +46,12 @@ public static GuiYesNoPopup open(com.replaymod.gui.container.GuiContainer contai return popup; } - private Consumer onClosed = (accepted) -> {}; - private Runnable onAccept = () -> {}; - private Runnable onReject = () -> {}; + private Consumer onClosed = (accepted) -> { + }; + private Runnable onAccept = () -> { + }; + private Runnable onReject = () -> { + }; private final com.replaymod.gui.element.GuiButton yesButton = new com.replaymod.gui.element.GuiButton().setSize(150, 20).onClick(new Runnable() { @Override @@ -101,12 +99,12 @@ public GuiYesNoPopup setNoLabel(String label) { return this; } - public GuiYesNoPopup setYesI18nLabel(String label, Object...args) { + public GuiYesNoPopup setYesI18nLabel(String label, Object... args) { yesButton.setI18nLabel(label, args); return this; } - public GuiYesNoPopup setNoI18nLabel(String label, Object...args) { + public GuiYesNoPopup setNoI18nLabel(String label, Object... args) { noButton.setI18nLabel(label, args); return this; } diff --git a/src/main/java/com/replaymod/gui/utils/EventRegistrations.java b/src/main/java/com/replaymod/gui/utils/EventRegistrations.java index 4a0ec788..1fe5bbf7 100644 --- a/src/main/java/com/replaymod/gui/utils/EventRegistrations.java +++ b/src/main/java/com/replaymod/gui/utils/EventRegistrations.java @@ -1,21 +1,15 @@ package com.replaymod.gui.utils; -//#if FABRIC<1 import com.replaymod.gui.versions.forge.EventsAdapter; import net.minecraftforge.common.MinecraftForge; -//#endif - -//#if MC<10809 -//$$ import net.minecraftforge.fml.common.FMLCommonHandler; -//#endif import java.util.ArrayList; import java.util.List; public class EventRegistrations { - //#if FABRIC<1 - static { new EventsAdapter().register(); } - //#endif + static { + new EventsAdapter().register(); + } private List> registrations = new ArrayList<>(); @@ -29,24 +23,14 @@ public EventRegistrations on(Event event, T listener) { } public void register() { - //#if FABRIC<1 MinecraftForge.EVENT_BUS.register(this); - //#endif - //#if MC<10809 - //$$ FMLCommonHandler.instance().bus().register(this); - //#endif for (EventRegistration registration : registrations) { registration.register(); } } public void unregister() { - //#if FABRIC<1 MinecraftForge.EVENT_BUS.unregister(this); - //#endif - //#if MC<10809 - //$$ FMLCommonHandler.instance().bus().unregister(this); - //#endif for (EventRegistration registration : registrations) { registration.unregister(); } diff --git a/src/main/java/com/replaymod/gui/utils/MouseUtils.java b/src/main/java/com/replaymod/gui/utils/MouseUtils.java index da48f312..9262fb71 100644 --- a/src/main/java/com/replaymod/gui/utils/MouseUtils.java +++ b/src/main/java/com/replaymod/gui/utils/MouseUtils.java @@ -26,43 +26,24 @@ import com.replaymod.gui.versions.MCVer; import de.johni0702.minecraft.gui.utils.lwjgl.Point; -import net.minecraft.client.Minecraft; - -//#if MC>=11400 import net.minecraft.client.MainWindow; -//#else -//$$ import net.minecraft.client.gui.ScaledResolution; -//$$ import org.lwjgl.input.Mouse; -//#endif +import net.minecraft.client.Minecraft; public class MouseUtils { private static final Minecraft mc = com.replaymod.gui.versions.MCVer.getMinecraft(); public static Point getMousePos() { - //#if MC>=11400 int mouseX = (int) mc.mouseHelper.getMouseX(); int mouseY = (int) mc.mouseHelper.getMouseY(); MainWindow mainWindow = com.replaymod.gui.versions.MCVer.newScaledResolution(mc); mouseX = (int) Math.round((double) mouseX * mainWindow.getScaledWidth() / mainWindow.getWidth()); mouseY = (int) Math.round((double) mouseY * mainWindow.getScaledHeight() / mainWindow.getHeight()); - //#else - //$$ Point scaled = getScaledDimensions(); - //$$ int width = scaled.getX(); - //$$ int height = scaled.getY(); - //$$ - //$$ int mouseX = (Mouse.getX() * width / mc.displayWidth); - //$$ int mouseY = (height - Mouse.getY() * height / mc.displayHeight); - //#endif return new Point(mouseX, mouseY); } public static Point getScaledDimensions() { - //#if MC>=11400 MainWindow - //#else - //$$ ScaledResolution - //#endif res = MCVer.newScaledResolution(mc); return new Point(res.getScaledWidth(), res.getScaledHeight()); } diff --git a/src/main/java/com/replaymod/gui/utils/StringUtils.java b/src/main/java/com/replaymod/gui/utils/StringUtils.java index 4e46b929..c8dcedd9 100644 --- a/src/main/java/com/replaymod/gui/utils/StringUtils.java +++ b/src/main/java/com/replaymod/gui/utils/StringUtils.java @@ -32,14 +32,14 @@ public class StringUtils { public static String[] splitStringInMultipleRows(String string, int maxWidth) { - if(string == null) return new String[0]; + if (string == null) return new String[0]; FontRenderer fontRenderer = MCVer.getFontRenderer(); List rows = new ArrayList<>(); String remaining = string; - while(remaining.length() > 0) { + while (remaining.length() > 0) { String[] split = remaining.split(" "); String b = ""; - for(String sp : split) { + for (String sp : split) { b += sp + " "; if (fontRenderer.getStringWidth(b.trim()) > maxWidth) { b = b.substring(0, b.trim().length() - (sp.length())); @@ -50,7 +50,7 @@ public static String[] splitStringInMultipleRows(String string, int maxWidth) { rows.add(trimmed); try { remaining = remaining.substring(trimmed.length() + 1); - } catch(Exception e) { + } catch (Exception e) { break; } } diff --git a/src/main/java/com/replaymod/gui/utils/Utils.java b/src/main/java/com/replaymod/gui/utils/Utils.java index 9174f7a3..b5bdf850 100644 --- a/src/main/java/com/replaymod/gui/utils/Utils.java +++ b/src/main/java/com/replaymod/gui/utils/Utils.java @@ -40,6 +40,7 @@ public class Utils { /** * Link the specified focusable compontents in the order they're supplied. + * * @param focusables Focusables to link * @see com.replaymod.gui.function.Focusable#setNext(com.replaymod.gui.function.Focusable) * @see com.replaymod.gui.function.Focusable#setPrevious(com.replaymod.gui.function.Focusable) diff --git a/src/main/java/com/replaymod/gui/versions/Image.java b/src/main/java/com/replaymod/gui/versions/Image.java index 0d7baa99..de4b55f4 100644 --- a/src/main/java/com/replaymod/gui/versions/Image.java +++ b/src/main/java/com/replaymod/gui/versions/Image.java @@ -1,16 +1,11 @@ package com.replaymod.gui.versions; -import net.minecraft.client.renderer.texture.NativeImage; import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.client.renderer.texture.NativeImage; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.nio.file.Files; import java.nio.file.Path; @@ -24,11 +19,7 @@ public class Image implements AutoCloseable { public Image(int width, int height) { this( - //#if FABRIC>=1 - //$$ new NativeImage(NativeImage.Format.ABGR, width, height, true) - //#else new NativeImage(NativeImage.PixelFormat.RGBA, width, height, true) - //#endif ); } diff --git a/src/main/java/com/replaymod/gui/versions/MCVer.java b/src/main/java/com/replaymod/gui/versions/MCVer.java index b0dbdc3d..8c687bd8 100644 --- a/src/main/java/com/replaymod/gui/versions/MCVer.java +++ b/src/main/java/com/replaymod/gui/versions/MCVer.java @@ -1,35 +1,17 @@ package com.replaymod.gui.versions; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor; +import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.crash.CrashReportCategory; -import org.lwjgl.opengl.GL11; - -//#if FABRIC>=1 -//#else import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; -//#endif - -//#if MC>=11400 -import net.minecraft.client.MainWindow; import org.lwjgl.glfw.GLFW; -//#else -//$$ import net.minecraft.client.gui.GuiScreen; -//$$ import net.minecraft.client.gui.ScaledResolution; -//#endif - -//#if MC>=10809 -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -//#endif - -//#if MC<10800 -//$$ import net.minecraft.client.renderer.OpenGlHelper; -//$$ import static org.lwjgl.opengl.GL11.*; -//#endif +import org.lwjgl.opengl.GL11; import java.util.concurrent.Callable; @@ -41,92 +23,33 @@ public static Minecraft getMinecraft() { return Minecraft.getInstance(); } - //#if MC>=11400 public static MainWindow newScaledResolution(Minecraft mc) { - //#if MC>=11500 return mc.getMainWindow(); - //#else - //$$ return mc.window; - //#endif } - //#else - //$$ public static ScaledResolution newScaledResolution(Minecraft mc) { - //#if MC>=10809 - //$$ return new ScaledResolution(mc); - //#else - //$$ return new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); - //#endif - //$$ } - //#endif public static void addDetail(CrashReportCategory category, String name, Callable callable) { - //#if MC>=10904 - //#if MC>=11200 category.addDetail(name, callable::call); - //#else - //$$ category.setDetail(name, callable::call); - //#endif - //#else - //$$ category.addCrashSectionCallable(name, callable); - //#endif } public static void drawRect(int right, int bottom, int left, int top) { - //#if MC>=10800 Tessellator tessellator = Tessellator.getInstance(); - //#else - //$$ Tessellator tessellator = Tessellator.instance; - //#endif - //#if MC>=10904 BufferBuilder vertexBuffer = tessellator.getBuffer(); - //#else - //#if MC>=10800 - //$$ WorldRenderer vertexBuffer = tessellator.getWorldRenderer(); - //#else - //$$ Tessellator vertexBuffer = tessellator; - //#endif - //#endif - //#if MC>=10809 vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); vertexBuffer.pos(right, top, 0).endVertex(); vertexBuffer.pos(left, top, 0).endVertex(); vertexBuffer.pos(left, bottom, 0).endVertex(); vertexBuffer.pos(right, bottom, 0).endVertex(); - //#else - //$$ vertexBuffer.startDrawingQuads(); - //$$ vertexBuffer.addVertex(right, top, 0); - //$$ vertexBuffer.addVertex(left, top, 0); - //$$ vertexBuffer.addVertex(left, bottom, 0); - //$$ vertexBuffer.addVertex(right, bottom, 0); - //#endif tessellator.draw(); } public static void drawRect(int x, int y, int width, int height, ReadableColor tl, ReadableColor tr, ReadableColor bl, ReadableColor br) { - //#if MC>=10800 Tessellator tessellator = Tessellator.getInstance(); BufferBuilder vertexBuffer = tessellator.getBuffer(); - //#else - //$$ Tessellator tessellator = Tessellator.instance; - //$$ Tessellator vertexBuffer = tessellator; - //#endif - //#if MC>=10809 vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR); vertexBuffer.pos(x, y + height, 0).color(bl.getRed(), bl.getGreen(), bl.getBlue(), bl.getAlpha()).endVertex(); vertexBuffer.pos(x + width, y + height, 0).color(br.getRed(), br.getGreen(), br.getBlue(), br.getAlpha()).endVertex(); vertexBuffer.pos(x + width, y, 0).color(tr.getRed(), tr.getGreen(), tr.getBlue(), tr.getAlpha()).endVertex(); vertexBuffer.pos(x, y, 0).color(tl.getRed(), tl.getGreen(), tl.getBlue(), tl.getAlpha()).endVertex(); - //#else - //$$ vertexBuffer.startDrawingQuads(); - //$$ vertexBuffer.setColorRGBA(bl.getRed(), bl.getGreen(), bl.getBlue(), bl.getAlpha()); - //$$ vertexBuffer.addVertex(x, y + height, 0); - //$$ vertexBuffer.setColorRGBA(br.getRed(), br.getGreen(), br.getBlue(), br.getAlpha()); - //$$ vertexBuffer.addVertex(x + width, y + height, 0); - //$$ vertexBuffer.setColorRGBA(tr.getRed(), tr.getGreen(), tr.getBlue(), tr.getAlpha()); - //$$ vertexBuffer.addVertex(x + width, y, 0); - //$$ vertexBuffer.setColorRGBA(tl.getRed(), tl.getGreen(), tl.getBlue(), tl.getAlpha()); - //$$ vertexBuffer.addVertex(x, y, 0); - //#endif tessellator.draw(); } @@ -134,65 +57,27 @@ public static FontRenderer getFontRenderer() { return getMinecraft().fontRenderer; } - //#if FABRIC<=0 public static RenderGameOverlayEvent.ElementType getType(RenderGameOverlayEvent event) { - //#if MC>=10904 return event.getType(); - //#else - //$$ return event.type; - //#endif } public static int getMouseX(GuiScreenEvent.DrawScreenEvent.Post event) { - //#if MC>=10904 return event.getMouseX(); - //#else - //$$ return event.mouseX; - //#endif } public static int getMouseY(GuiScreenEvent.DrawScreenEvent.Post event) { - //#if MC>=10904 return event.getMouseY(); - //#else - //$$ return event.mouseY; - //#endif } - //#endif public static void setClipboardString(String text) { - //#if MC>=11400 getMinecraft().keyboardListener.setClipboardString(text); - //#else - //$$ GuiScreen.setClipboardString(text); - //#endif } public static String getClipboardString() { - //#if MC>=11400 return getMinecraft().keyboardListener.getClipboardString(); - //#else - //$$ return GuiScreen.getClipboardString(); - //#endif } - //#if MC<=10710 - //$$ public static void color(float r, float g, float b) { GL11.glColor3f(r, g, b); } - //$$ public static void color(float r, float g, float b, float a) { GL11.glColor4f(r, g, b, a); } - //$$ public static void enableBlend() { GL11.glEnable(GL_BLEND); } - //$$ public static void enableTexture2D() { GL11.glEnable(GL_TEXTURE_2D); } - //$$ public static void enableAlpha() { GL11.glEnable(GL_ALPHA_TEST); } - //$$ public static void disableTexture2D() { GL11.glDisable(GL_TEXTURE_2D); } - //$$ public static void disableAlpha() { GL11.glDisable(GL_ALPHA_TEST); } - //$$ public static void blendFunc(int s, int d) { GL11.glBlendFunc(s, d); } - //$$ public static void tryBlendFuncSeparate(int l, int r, int vl, int vr) { OpenGlHelper.glBlendFunc(l, r, vl, vr); } - //$$ public static void shadeModel(int mode) { GL11.glShadeModel(mode); } - //$$ public static void enableColorLogic() { GL11.glEnable(GL_COLOR_LOGIC_OP); } - //$$ public static void disableColorLogic() { GL11.glDisable(GL_COLOR_LOGIC_OP); } - //$$ public static void colorLogicOp(int op) { GL11.glLogicOp(op); } - //#endif - - //#if MC>=11400 + public static abstract class Keyboard { public static final int KEY_ESCAPE = GLFW.GLFW_KEY_ESCAPE; public static final int KEY_HOME = GLFW.GLFW_KEY_HOME; @@ -214,5 +99,4 @@ public static void enableRepeatEvents(boolean enabled) { getMinecraft().keyboardListener.enableRepeatEvents(enabled); } } - //#endif } diff --git a/src/main/java/com/replaymod/gui/versions/callbacks/KeyboardCallback.java b/src/main/java/com/replaymod/gui/versions/callbacks/KeyboardCallback.java index e35fd038..bbac9c51 100644 --- a/src/main/java/com/replaymod/gui/versions/callbacks/KeyboardCallback.java +++ b/src/main/java/com/replaymod/gui/versions/callbacks/KeyboardCallback.java @@ -38,6 +38,8 @@ public boolean charTyped(char charCode, int scanCode) { ); boolean keyPressed(int keyCode, int scanCode, int modifiers); + boolean keyReleased(int keyCode, int scanCode, int modifiers); + boolean charTyped(char keyChar, int scanCode); } diff --git a/src/main/java/com/replaymod/gui/versions/callbacks/MouseCallback.java b/src/main/java/com/replaymod/gui/versions/callbacks/MouseCallback.java index 293b86e3..24e52408 100644 --- a/src/main/java/com/replaymod/gui/versions/callbacks/MouseCallback.java +++ b/src/main/java/com/replaymod/gui/versions/callbacks/MouseCallback.java @@ -48,7 +48,10 @@ public boolean mouseScroll(double x, double y, double scroll) { ); boolean mouseDown(double x, double y, int button); + boolean mouseDrag(double x, double y, int button, double dx, double dy); + boolean mouseUp(double x, double y, int button); + boolean mouseScroll(double x, double y, double scroll); } diff --git a/src/main/java/com/replaymod/gui/versions/callbacks/PostRenderScreenCallback.java b/src/main/java/com/replaymod/gui/versions/callbacks/PostRenderScreenCallback.java index a3efa9ef..ebb297ba 100644 --- a/src/main/java/com/replaymod/gui/versions/callbacks/PostRenderScreenCallback.java +++ b/src/main/java/com/replaymod/gui/versions/callbacks/PostRenderScreenCallback.java @@ -1,7 +1,7 @@ package com.replaymod.gui.versions.callbacks; -import com.replaymod.gui.utils.Event; import com.mojang.blaze3d.matrix.MatrixStack; +import com.replaymod.gui.utils.Event; public interface PostRenderScreenCallback { Event EVENT = Event.create((listeners) -> diff --git a/src/main/java/com/replaymod/gui/versions/callbacks/RenderHudCallback.java b/src/main/java/com/replaymod/gui/versions/callbacks/RenderHudCallback.java index 4634452a..de108cb5 100644 --- a/src/main/java/com/replaymod/gui/versions/callbacks/RenderHudCallback.java +++ b/src/main/java/com/replaymod/gui/versions/callbacks/RenderHudCallback.java @@ -1,7 +1,7 @@ package com.replaymod.gui.versions.callbacks; -import com.replaymod.gui.utils.Event; import com.mojang.blaze3d.matrix.MatrixStack; +import com.replaymod.gui.utils.Event; public interface RenderHudCallback { Event EVENT = Event.create((listeners) -> diff --git a/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java b/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java index be08964f..68910a62 100644 --- a/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java +++ b/src/main/java/com/replaymod/gui/versions/forge/EventsAdapter.java @@ -16,19 +16,11 @@ public class EventsAdapter extends EventRegistrations { public static Screen getScreen(GuiScreenEvent event) { - //#if MC>=10904 return event.getGui(); - //#else - //$$ return event.gui; - //#endif } public static List getButtonList(GuiScreenEvent.InitGuiEvent event) { - //#if MC>=10904 return event.getWidgetList(); - //#else - //$$ return event.buttonList; - //#endif } @SubscribeEvent @@ -44,28 +36,16 @@ public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) { @SubscribeEvent(priority = EventPriority.LOWEST) public void onGuiClosed(GuiOpenEvent event) { OpenGuiScreenCallback.EVENT.invoker().openGuiScreen( - //#if MC>=10904 event.getGui() - //#else - //$$ event.gui - //#endif ); } public static float getPartialTicks(RenderGameOverlayEvent event) { - //#if MC>=10904 return event.getPartialTicks(); - //#else - //$$ return event.partialTicks; - //#endif } public static float getPartialTicks(GuiScreenEvent.DrawScreenEvent.Post event) { - //#if MC>=10904 return event.getRenderPartialTicks(); - //#else - //$$ return event.renderPartialTicks; - //#endif } @SubscribeEvent diff --git a/src/main/java/com/replaymod/mixin/AbstractButtonWidgetAccessor.java b/src/main/java/com/replaymod/mixin/AbstractButtonWidgetAccessor.java index 7d534b31..8053e7c0 100644 --- a/src/main/java/com/replaymod/mixin/AbstractButtonWidgetAccessor.java +++ b/src/main/java/com/replaymod/mixin/AbstractButtonWidgetAccessor.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.mixin; import net.minecraft.client.gui.widget.Widget; @@ -10,4 +9,3 @@ public interface AbstractButtonWidgetAccessor { @Accessor int getHeight(); } -//#endif diff --git a/src/main/java/com/replaymod/mixin/ContainerLocalRenderInformationAccessor.java b/src/main/java/com/replaymod/mixin/ContainerLocalRenderInformationAccessor.java index 04ea4602..e69de29b 100644 --- a/src/main/java/com/replaymod/mixin/ContainerLocalRenderInformationAccessor.java +++ b/src/main/java/com/replaymod/mixin/ContainerLocalRenderInformationAccessor.java @@ -1,30 +0,0 @@ -//#if MC>=10800 && MC<11500 -//$$ package com.replaymod.render.blend.mixin; -//$$ -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.gen.Accessor; -//$$ -//#if MC>=11500 -//$$ import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk; -//#else -//$$ import net.minecraft.client.render.chunk.ChunkRenderer; -//#endif -//$$ -//$$ // If this mixin doesn't apply in a development environment, use the following target instead. This seems to be a -//$$ // (or multiple) bugs in mixin: https://github.com/SpongePowered/Mixin/issues/390 -//$$ // @Mixin(targets = "net.minecraft.client.render.WorldRenderer$ChunkInfo") -//$$ @Mixin(targets = "net.minecraft.client.render.WorldRenderer.ChunkInfo") -//$$ public interface ContainerLocalRenderInformationAccessor { - //#if MC>=11500 - //$$ @Accessor("chunk") - //$$ BuiltChunk getRenderChunk(); - //#else - //#if MC>=11400 - //$$ @Accessor("renderer") - //#else - //$$ @Accessor - //#endif - //$$ ChunkRenderer getRenderChunk(); - //#endif -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/EntityAccessor.java b/src/main/java/com/replaymod/mixin/EntityAccessor.java index a5e4d74f..e69de29b 100644 --- a/src/main/java/com/replaymod/mixin/EntityAccessor.java +++ b/src/main/java/com/replaymod/mixin/EntityAccessor.java @@ -1,23 +0,0 @@ -//#if MC<10904 -//$$ package com.replaymod.render.blend.mixin; -//$$ -//$$ import net.minecraft.entity.Entity; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.gen.Accessor; -//$$ -//$$ @Mixin(Entity.class) -//$$ public interface EntityAccessor { -//$$ @Accessor -//$$ double getPrevPosX(); -//$$ @Accessor -//$$ double getPrevPosY(); -//$$ @Accessor -//$$ double getPrevPosZ(); -//$$ @Accessor -//$$ double getPosX(); -//$$ @Accessor -//$$ double getPosY(); -//$$ @Accessor -//$$ double getPosZ(); -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/EntityLivingBaseAccessor.java b/src/main/java/com/replaymod/mixin/EntityLivingBaseAccessor.java index 06e61d5d..a7574f90 100644 --- a/src/main/java/com/replaymod/mixin/EntityLivingBaseAccessor.java +++ b/src/main/java/com/replaymod/mixin/EntityLivingBaseAccessor.java @@ -1,21 +1,18 @@ package com.replaymod.mixin; import net.minecraft.entity.LivingEntity; +import net.minecraft.network.datasync.DataParameter; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import javax.annotation.Nonnull; -//#if MC>=10904 -import net.minecraft.network.datasync.DataParameter; -//#endif - @Mixin(LivingEntity.class) public interface EntityLivingBaseAccessor { - //#if MC>=10904 @Accessor("LIVING_FLAGS") @Nonnull @SuppressWarnings("ConstantConditions") - static DataParameter getLivingFlags() { return null; } - //#endif + static DataParameter getLivingFlags() { + return null; + } } diff --git a/src/main/java/com/replaymod/mixin/EntityOtherPlayerMPAccessor.java b/src/main/java/com/replaymod/mixin/EntityOtherPlayerMPAccessor.java index d7530c5a..e69de29b 100644 --- a/src/main/java/com/replaymod/mixin/EntityOtherPlayerMPAccessor.java +++ b/src/main/java/com/replaymod/mixin/EntityOtherPlayerMPAccessor.java @@ -1,21 +0,0 @@ -//#if MC<11400 -//$$ package com.replaymod.replay.mixin; -//$$ -//$$ import net.minecraft.client.entity.EntityOtherPlayerMP; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.gen.Accessor; -//$$ -//$$ @Mixin(EntityOtherPlayerMP.class) -//$$ public interface EntityOtherPlayerMPAccessor { -//$$ @Accessor -//$$ double getOtherPlayerMPX(); -//$$ @Accessor -//$$ double getOtherPlayerMPY(); -//$$ @Accessor -//$$ double getOtherPlayerMPZ(); -//$$ @Accessor -//$$ double getOtherPlayerMPYaw(); -//$$ @Accessor -//$$ double getOtherPlayerMPPitch(); -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/EntityPlayerAccessor.java b/src/main/java/com/replaymod/mixin/EntityPlayerAccessor.java index d65fd8ab..465e657d 100644 --- a/src/main/java/com/replaymod/mixin/EntityPlayerAccessor.java +++ b/src/main/java/com/replaymod/mixin/EntityPlayerAccessor.java @@ -7,19 +7,9 @@ @Mixin(PlayerEntity.class) public interface EntityPlayerAccessor extends Mixin_EntityLivingBaseAccessor { - //#if MC>=10904 @Accessor ItemStack getItemStackMainHand(); + @Accessor void setItemStackMainHand(ItemStack value); - //#else - //$$ @Accessor - //$$ ItemStack getItemInUse(); - //$$ @Accessor - //$$ void setItemInUse(ItemStack value); - //$$ @Accessor - //$$ int getItemInUseCount(); - //$$ @Accessor - //$$ void setItemInUseCount(int value); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/FirstPersonRendererAccessor.java b/src/main/java/com/replaymod/mixin/FirstPersonRendererAccessor.java index b9e7e00c..e0cbbdfb 100644 --- a/src/main/java/com/replaymod/mixin/FirstPersonRendererAccessor.java +++ b/src/main/java/com/replaymod/mixin/FirstPersonRendererAccessor.java @@ -7,27 +7,21 @@ @Mixin(FirstPersonRenderer.class) public interface FirstPersonRendererAccessor { - //#if MC>=10904 @Accessor void setItemStackMainHand(ItemStack value); + @Accessor void setItemStackOffHand(ItemStack value); + @Accessor void setEquippedProgressMainHand(float value); + @Accessor void setPrevEquippedProgressMainHand(float value); + @Accessor void setEquippedProgressOffHand(float value); + @Accessor void setPrevEquippedProgressOffHand(float value); - //#else - //$$ @Accessor - //$$ void setItemToRender(ItemStack value); - //$$ @Accessor - //$$ void setEquippedItemSlot(int value); - //$$ @Accessor - //$$ void setEquippedProgress(float value); - //$$ @Accessor - //$$ void setPrevEquippedProgress(float value); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/GuiMainMenuAccessor.java b/src/main/java/com/replaymod/mixin/GuiMainMenuAccessor.java index 68e11cae..8e9fcceb 100644 --- a/src/main/java/com/replaymod/mixin/GuiMainMenuAccessor.java +++ b/src/main/java/com/replaymod/mixin/GuiMainMenuAccessor.java @@ -7,10 +7,9 @@ @Mixin(MainMenuScreen.class) public interface GuiMainMenuAccessor { - //#if MC>=10904 @Accessor Screen getRealmsNotification(); + @Accessor void setRealmsNotification(Screen value); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/GuiScreenAccessor.java b/src/main/java/com/replaymod/mixin/GuiScreenAccessor.java index 32caebaa..8808daf6 100644 --- a/src/main/java/com/replaymod/mixin/GuiScreenAccessor.java +++ b/src/main/java/com/replaymod/mixin/GuiScreenAccessor.java @@ -1,33 +1,18 @@ package com.replaymod.mixin; +import net.minecraft.client.gui.IGuiEventListener; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.Widget; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import java.util.List; -//#if MC>=11400 -import net.minecraft.client.gui.widget.Widget; -//#else -//$$ import net.minecraft.client.gui.GuiButton; -//#endif - -//#if MC>=11400 -import net.minecraft.client.gui.IGuiEventListener; -//#endif - @Mixin(Screen.class) public interface GuiScreenAccessor { - //#if MC>=11400 @Accessor List getButtons(); - //#else - //$$ @Accessor("buttonList") - //$$ List getButtons(); - //#endif - //#if MC>=11400 @Accessor List getChildren(); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/IntegratedServerAccessor.java b/src/main/java/com/replaymod/mixin/IntegratedServerAccessor.java index 02eda9a7..ed019deb 100644 --- a/src/main/java/com/replaymod/mixin/IntegratedServerAccessor.java +++ b/src/main/java/com/replaymod/mixin/IntegratedServerAccessor.java @@ -7,10 +7,6 @@ @Mixin(IntegratedServer.class) public interface IntegratedServerAccessor { // TODO probably https://github.com/ReplayMod/remap/issues/10 - //#if MC>=11500 @Accessor("isGamePaused") - //#else - //$$ @Accessor("field_5524") - //#endif boolean isGamePaused(); } diff --git a/src/main/java/com/replaymod/mixin/ItemRendererAccessor.java b/src/main/java/com/replaymod/mixin/ItemRendererAccessor.java index f747064d..df4c4690 100644 --- a/src/main/java/com/replaymod/mixin/ItemRendererAccessor.java +++ b/src/main/java/com/replaymod/mixin/ItemRendererAccessor.java @@ -1,4 +1,3 @@ -//#if MC>=10904 package com.replaymod.mixin; import net.minecraft.client.renderer.ItemRenderer; @@ -11,4 +10,3 @@ public interface ItemRendererAccessor { @Accessor ItemColors getItemColors(); } -//#endif diff --git a/src/main/java/com/replaymod/mixin/KeyBindingAccessor.java b/src/main/java/com/replaymod/mixin/KeyBindingAccessor.java index 8553259c..4066856d 100644 --- a/src/main/java/com/replaymod/mixin/KeyBindingAccessor.java +++ b/src/main/java/com/replaymod/mixin/KeyBindingAccessor.java @@ -8,6 +8,7 @@ public interface KeyBindingAccessor { @Accessor int getPressTime(); + @Accessor void setPressTime(int value); } diff --git a/src/main/java/com/replaymod/mixin/MainWindowAccessor.java b/src/main/java/com/replaymod/mixin/MainWindowAccessor.java index a044d217..2edc0ae1 100644 --- a/src/main/java/com/replaymod/mixin/MainWindowAccessor.java +++ b/src/main/java/com/replaymod/mixin/MainWindowAccessor.java @@ -8,10 +8,13 @@ public interface MainWindowAccessor { @Accessor int getFramebufferWidth(); + @Accessor void setFramebufferWidth(int value); + @Accessor int getFramebufferHeight(); + @Accessor void setFramebufferHeight(int value); } diff --git a/src/main/java/com/replaymod/mixin/MinecraftAccessor.java b/src/main/java/com/replaymod/mixin/MinecraftAccessor.java index 28bd1f53..fcd6ce17 100644 --- a/src/main/java/com/replaymod/mixin/MinecraftAccessor.java +++ b/src/main/java/com/replaymod/mixin/MinecraftAccessor.java @@ -7,52 +7,27 @@ import org.spongepowered.asm.mixin.gen.Accessor; import java.util.Queue; - -//#if MC>=11400 import java.util.concurrent.CompletableFuture; -//#endif - -//#if MC<11400 -//$$ import java.util.concurrent.FutureTask; -//#endif -//#if MC<11400 -//$$ import net.minecraft.client.resources.IResourcePack; -//$$ import java.util.List; -//#endif @Mixin(Minecraft.class) public interface MinecraftAccessor { @Accessor Timer getTimer(); + @Accessor void setTimer(Timer value); - //#if MC>=11400 @Accessor("futureRefreshResources") CompletableFuture getResourceReloadFuture(); + @Accessor("futureRefreshResources") void setResourceReloadFuture(CompletableFuture value); - //#endif - //#if MC>=11400 @Accessor("queueChunkTracking") Queue getRenderTaskQueue(); - //#else - //$$ @Accessor - //$$ Queue> getScheduledTasks(); - //#endif - - //#if FABRIC>=1 - //$$ @Accessor("crashReport") - //$$ CrashReport getCrashReporter(); - //#else + @Accessor CrashReport getCrashReporter(); - //#endif - //#if MC<11400 - //$$ @Accessor - //$$ List getDefaultResourcePacks(); - //#endif } diff --git a/src/main/java/com/replaymod/mixin/MixinCamera.java b/src/main/java/com/replaymod/mixin/MixinCamera.java index fb90e140..add8a171 100644 --- a/src/main/java/com/replaymod/mixin/MixinCamera.java +++ b/src/main/java/com/replaymod/mixin/MixinCamera.java @@ -1,11 +1,11 @@ package com.replaymod.mixin; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; -import com.mojang.blaze3d.matrix.MatrixStack; -import net.minecraft.util.math.vector.Vector3f; import net.minecraft.entity.Entity; +import net.minecraft.util.math.vector.Vector3f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -15,7 +15,10 @@ @Mixin(GameRenderer.class) public class MixinCamera { - @Shadow @Final private Minecraft mc; + @Shadow + @Final + private Minecraft mc; + @Inject( method = "renderWorld", at = @At( diff --git a/src/main/java/com/replaymod/mixin/MixinChunkVisibility.java b/src/main/java/com/replaymod/mixin/MixinChunkVisibility.java index b5d24382..2612f11f 100644 --- a/src/main/java/com/replaymod/mixin/MixinChunkVisibility.java +++ b/src/main/java/com/replaymod/mixin/MixinChunkVisibility.java @@ -1,4 +1,3 @@ -//#if MC>=11500 package com.replaymod.mixin; import org.spongepowered.asm.mixin.Mixin; @@ -29,4 +28,3 @@ private static void replayModCompat_fixImproperReset(CallbackInfo ci) { MixinChunkVisibility.counter = 0; } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java b/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java index 1bf9487d..d9e71f33 100644 --- a/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java +++ b/src/main/java/com/replaymod/mixin/MixinClientPlayNetHandler.java @@ -15,7 +15,8 @@ @Mixin(ClientPlayNetHandler.class) public abstract class MixinClientPlayNetHandler { - @Shadow @Final + @Shadow + @Final private NetworkManager netManager; @Shadow @@ -24,7 +25,7 @@ public abstract class MixinClientPlayNetHandler { @Shadow private ITagCollectionSupplier networkTagManager; - @Inject(method = "handleTags", at=@At(value = "HEAD"), cancellable = true) + @Inject(method = "handleTags", at = @At(value = "HEAD"), cancellable = true) public void replayMod_ignoreHandshakeConnectionClose(STagsListPacket packetIn, CallbackInfo ci) { System.out.println("Injected ClientPlayNetHandler.handleTags"); // PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.client); diff --git a/src/main/java/com/replaymod/mixin/MixinDownloadingPackFinder.java b/src/main/java/com/replaymod/mixin/MixinDownloadingPackFinder.java index 5edb94be..ef564230 100644 --- a/src/main/java/com/replaymod/mixin/MixinDownloadingPackFinder.java +++ b/src/main/java/com/replaymod/mixin/MixinDownloadingPackFinder.java @@ -1,27 +1,15 @@ -//#if MC>=10800 package com.replaymod.mixin; -import com.replaymod.recording.packet.ResourcePackRecorder; import com.replaymod.gui.utils.Consumer; +import com.replaymod.recording.packet.ResourcePackRecorder; import net.minecraft.client.resources.DownloadingPackFinder; +import net.minecraft.resources.IPackNameDecorator; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; - -import java.io.File; - -//#if MC>=11600 -import net.minecraft.resources.IPackNameDecorator; -//#endif - -//#if MC>=10800 import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#else -//$$ import org.spongepowered.asm.mixin.injection.Redirect; -//$$ import net.minecraft.util.HttpUtil; -//$$ import java.lang.reflect.Proxy; -//$$ import java.util.Map; -//#endif + +import java.io.File; @Mixin(DownloadingPackFinder.class) public abstract class MixinDownloadingPackFinder implements ResourcePackRecorder.IDownloadingPackFinder { @@ -32,13 +20,10 @@ public void setRequestCallback(Consumer callback) { requestCallback = callback; } - //#if MC>=10800 @Inject(method = "setServerPack", at = @At("HEAD")) private void recordDownloadedPack( File file, - //#if MC>=11600 IPackNameDecorator arg, - //#endif CallbackInfoReturnable ci ) { if (requestCallback != null) { @@ -46,19 +31,4 @@ private void recordDownloadedPack( requestCallback = null; } } - //#else - //$$ @Redirect(method = "func_148528_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/HttpUtil;downloadResourcePack(Ljava/io/File;Ljava/lang/String;Lnet/minecraft/util/HttpUtil$DownloadListener;Ljava/util/Map;ILnet/minecraft/util/HttpUtil$IProgressUpdate;Ljava/net/Proxy;)V")) - //$$ private void downloadResourcePack(File dst, String url, HttpUtil.DownloadListener callback, final Map headers, final int maxSize, final HttpUtil.IProgressUpdate progress, Proxy proxy) { - //$$ HttpUtil.downloadResourcePack(dst, url, new HttpUtil.DownloadListener() { - //$$ public void onDownloadComplete(File file) { - //$$ if (requestCallback != null) { - //$$ requestCallback.consume(file); - //$$ requestCallback = null; - //$$ } - //$$ callback.onDownloadComplete(file); - //$$ } - //$$ }, headers, maxSize, progress, proxy); - //$$ } - //#endif } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java b/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java index 29815314..f1eaf2c4 100644 --- a/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java +++ b/src/main/java/com/replaymod/mixin/MixinFMLHandshakeHandler.java @@ -1,6 +1,5 @@ package com.replaymod.mixin; -import io.netty.channel.ChannelPipeline; import net.minecraft.network.NetworkManager; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.fml.network.FMLHandshakeHandler; @@ -8,9 +7,7 @@ import net.minecraftforge.fml.network.NetworkRegistry; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.MixinEnvironment; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; @@ -23,7 +20,8 @@ public abstract class MixinFMLHandshakeHandler { @Shadow private List messageList; - @Shadow @Final + @Shadow + @Final private NetworkDirection direction; @Inject(method = "(Lnet/minecraft/network/NetworkManager;Lnet/minecraftforge/fml/network/NetworkDirection;)V", at = @At("TAIL")) @@ -36,6 +34,7 @@ public void replayModRecording_setupForLocalRecording(NetworkManager networkMana this.messageList = NetworkRegistryAccessor.invokeGatherLoginPayloads(this.direction, false); } - @Redirect(method = "handleRegistryLoading", at=@At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;closeChannel(Lnet/minecraft/util/text/ITextComponent;)V")) - public void replayMod_ignoreHandshakeConnectionClose(NetworkManager networkManager, ITextComponent message) {} + @Redirect(method = "handleRegistryLoading", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;closeChannel(Lnet/minecraft/util/text/ITextComponent;)V")) + public void replayMod_ignoreHandshakeConnectionClose(NetworkManager networkManager, ITextComponent message) { + } } diff --git a/src/main/java/com/replaymod/mixin/MixinGameRenderer.java b/src/main/java/com/replaymod/mixin/MixinGameRenderer.java index 7a789bda..42aeb6ab 100644 --- a/src/main/java/com/replaymod/mixin/MixinGameRenderer.java +++ b/src/main/java/com/replaymod/mixin/MixinGameRenderer.java @@ -1,11 +1,10 @@ -//#if MC>=11400 package com.replaymod.mixin; +import com.mojang.blaze3d.matrix.MatrixStack; import com.replaymod.core.events.PostRenderWorldCallback; import com.replaymod.core.events.PreRenderHandCallback; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.GameRenderer; -import com.mojang.blaze3d.matrix.MatrixStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -23,21 +22,14 @@ public class MixinGameRenderer { private void postRenderWorld( float partialTicks, long nanoTime, - //#if MC>=11500 MatrixStack matrixStack, - //#endif CallbackInfo ci) { - //#if MC<11500 - //$$ MatrixStack matrixStack = new MatrixStack(); - //#endif PostRenderWorldCallback.EVENT.invoker().postRenderWorld(matrixStack); } @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) private void preRenderHand( - //#if MC>=11500 MatrixStack matrixStack, - //#endif ActiveRenderInfo camera, float partialTicks, CallbackInfo ci) { @@ -46,4 +38,3 @@ private void preRenderHand( } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinGlStateManager.java b/src/main/java/com/replaymod/mixin/MixinGlStateManager.java index f368fa4f..6ca593e3 100644 --- a/src/main/java/com/replaymod/mixin/MixinGlStateManager.java +++ b/src/main/java/com/replaymod/mixin/MixinGlStateManager.java @@ -1,9 +1,8 @@ -//#if MC>=10800 package com.replaymod.mixin; +import com.mojang.blaze3d.platform.GlStateManager; import com.replaymod.render.hooks.FogStateCallback; import com.replaymod.render.hooks.Texture2DStateCallback; -import com.mojang.blaze3d.platform.GlStateManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -12,7 +11,8 @@ @Mixin(GlStateManager.class) public abstract class MixinGlStateManager { - @Shadow private static int activeTexture; + @Shadow + private static int activeTexture; @Inject(method = "enableFog", at = @At("HEAD")) private static void enableFog(CallbackInfo ci) { @@ -34,4 +34,3 @@ private static void disableTexture(CallbackInfo ci) { Texture2DStateCallback.EVENT.invoker().texture2DStateChanged(MixinGlStateManager.activeTexture, false); } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinGuiSpectator.java b/src/main/java/com/replaymod/mixin/MixinGuiSpectator.java index 5cd447ea..15a4dce2 100644 --- a/src/main/java/com/replaymod/mixin/MixinGuiSpectator.java +++ b/src/main/java/com/replaymod/mixin/MixinGuiSpectator.java @@ -1,4 +1,3 @@ -//#if MC>=10800 package com.replaymod.mixin; import com.replaymod.replay.camera.CameraEntity; @@ -8,21 +7,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static com.replaymod.core.versions.MCVer.*; +import static com.replaymod.core.versions.MCVer.getMinecraft; @Mixin(SpectatorGui.class) public abstract class MixinGuiSpectator { - //#if MC>=10904 @Inject(method = "onMouseScroll", at = @At("HEAD"), cancellable = true) - //#else - //$$ @Inject(method = "func_175260_a", at = @At("HEAD"), cancellable = true) - //#endif public void isInReplay( - //#if MC>=11400 double i, - //#else - //$$ int i, - //#endif CallbackInfo ci ) { // Prevent spectator gui from opening while in a replay @@ -31,4 +22,3 @@ public void isInReplay( } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinInGameHud.java b/src/main/java/com/replaymod/mixin/MixinInGameHud.java index 189cecfa..6a1c88cb 100644 --- a/src/main/java/com/replaymod/mixin/MixinInGameHud.java +++ b/src/main/java/com/replaymod/mixin/MixinInGameHud.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.mixin; import com.replaymod.replay.events.RenderHotbarCallback; @@ -28,4 +27,3 @@ private void shouldRenderHotbar(CallbackInfo ci) { } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinMinecraft.java b/src/main/java/com/replaymod/mixin/MixinMinecraft.java index 6d802519..b3bd9c40 100644 --- a/src/main/java/com/replaymod/mixin/MixinMinecraft.java +++ b/src/main/java/com/replaymod/mixin/MixinMinecraft.java @@ -1,55 +1,36 @@ package com.replaymod.mixin; import com.replaymod.core.MinecraftMethodAccessor; +import com.replaymod.core.events.PostRenderCallback; +import com.replaymod.core.events.PreRenderCallback; import net.minecraft.client.Minecraft; +import net.minecraft.util.concurrent.RecursiveEventLoop; 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; -//#if MC>=11400 -import com.replaymod.core.events.PostRenderCallback; -import com.replaymod.core.events.PreRenderCallback; -//#else -//$$ import org.spongepowered.asm.mixin.injection.Redirect; -//$$ import com.replaymod.replay.InputReplayTimer; -//$$ import org.lwjgl.input.Mouse; -//#endif - -//#if MC>=11400 -import net.minecraft.util.concurrent.RecursiveEventLoop; -//#endif - @Mixin(Minecraft.class) public abstract class MixinMinecraft - //#if MC>=11400 extends RecursiveEventLoop - //#endif - implements MinecraftMethodAccessor - { + implements MinecraftMethodAccessor { - //#if MC>=11400 - public MixinMinecraft(String string_1) { super(string_1); } - //#endif + public MixinMinecraft(String string_1) { + super(string_1); + } - //#if FABRIC>=1 - //$$ @Shadow protected abstract void handleInputEvents(); - //#elseif MC>=11400 - @Shadow protected abstract void processKeyBinds(); - //#endif + @Shadow + protected abstract void processKeyBinds(); public void replayModProcessKeyBinds() { processKeyBinds(); } - //#if MC>=11400 public void replayModExecuteTaskQueue() { drainTasks(); } - //#endif - //#if MC>=11400 @Inject(method = "runGameLoop", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GameRenderer;updateCameraAndRender(FJZ)V")) @@ -64,53 +45,4 @@ private void preRender(boolean unused, CallbackInfo ci) { private void postRender(boolean unused, CallbackInfo ci) { PostRenderCallback.EVENT.invoker().postRender(); } - //#else - //#if MC>=10904 - //$$ @Shadow protected abstract void runTickKeyboard() throws IOException; - //$$ @Shadow protected abstract void runTickMouse() throws IOException; - //$$ - //$$ @Override - //$$ public void replayModRunTickKeyboard() { - //$$ try { - //$$ runTickKeyboard(); - //$$ } catch (IOException e) { - //$$ e.printStackTrace(); - //$$ } - //$$ } - //$$ - //$$ @Override - //$$ public void replayModRunTickMouse() { - //$$ try { - //$$ runTickMouse(); - //$$ } catch (IOException e) { - //$$ e.printStackTrace(); - //$$ } - //$$ } - //#else - //$$ private boolean earlyReturn; - //$$ - //$$ @Override - //$$ public void replayModSetEarlyReturnFromRunTick(boolean earlyReturn) { - //$$ this.earlyReturn = earlyReturn; - //$$ } - //$$ - //$$ @Inject(method = "runTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;sendClickBlockToController(Z)V"), cancellable = true) - //$$ private void doEarlyReturnFromRunTick(CallbackInfo ci) { - //$$ if (earlyReturn) ci.cancel(); - //$$ } - //#endif - //$$ @Redirect( - //#if MC>=10904 - //$$ method = "runTickMouse", - //#else - //$$ method = "runTick", - //#endif - //$$ at = @At(value = "INVOKE", target = "Lorg/lwjgl/input/Mouse;getEventDWheel()I", remap = false) - //$$ ) - //$$ private int scroll() { - //$$ int wheel = Mouse.getEventDWheel(); - //$$ InputReplayTimer.handleScroll(wheel); - //$$ return wheel; - //$$ } - //#endif } diff --git a/src/main/java/com/replaymod/mixin/MixinModelRenderer.java b/src/main/java/com/replaymod/mixin/MixinModelRenderer.java index 5ea692c3..e229a285 100644 --- a/src/main/java/com/replaymod/mixin/MixinModelRenderer.java +++ b/src/main/java/com/replaymod/mixin/MixinModelRenderer.java @@ -1,73 +1 @@ // FIXME 1.15 -//#if MC>=10800 && MC<11500 -//$$ package com.replaymod.render.blend.mixin; -//$$ -//$$ import com.replaymod.render.blend.BlendState; -//$$ import com.replaymod.render.blend.exporters.ModelRendererExporter; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.injection.At; -//$$ import org.spongepowered.asm.mixin.injection.Inject; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ -//#if MC>=11400 -//$$ import net.minecraft.client.model.ModelPart; -//#else -//$$ import net.minecraft.client.model.ModelRenderer; -//#endif -//$$ -//$$ @Mixin(ModelPart.class) -//$$ public abstract class MixinModelRenderer { -//$$ @Inject(method = "render", at = @At("HEAD")) -//$$ public void preRender(float scale, CallbackInfo ci) { -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(ModelRendererExporter.class).preRenderModel((ModelPart)(Object)this, scale); -//$$ } -//$$ } -//$$ -//$$ @Inject(method = "method_2852", at = @At("HEAD")) -//$$ public void preRenderWithRotation(float scale, CallbackInfo ci) { -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(ModelRendererExporter.class).preRenderModel((ModelPart)(Object)this, scale); -//$$ } -//$$ } -//$$ -//$$ @Inject(method = "render", at = @At("RETURN")) -//$$ public void postRender(float scale, CallbackInfo ci) { -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(ModelRendererExporter.class).postRenderModel(); -//$$ } -//$$ } -//$$ -//$$ @Inject(method = "method_2852", at = @At("RETURN")) -//$$ public void postRenderWithRotation(float scale, CallbackInfo ci) { -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(ModelRendererExporter.class).postRenderModel(); -//$$ } -//$$ } -//$$ -//$$ @Inject(method = "render", -//$$ at = @At(value = "INVOKE", -//$$ target = "Lcom/mojang/blaze3d/platform/GlStateManager;callList(I)V"), -//$$ expect = 3) -//$$ public void onRender(float scale, CallbackInfo ci) { -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(ModelRendererExporter.class).onRenderModel(); -//$$ } -//$$ } -//$$ -//$$ @Inject(method = "method_2852", -//$$ at = @At(value = "INVOKE", -//$$ target = "Lcom/mojang/blaze3d/platform/GlStateManager;callList(I)V")) -//$$ public void onRenderWithRotation(float scale, CallbackInfo ci) { -//$$ BlendState blendState = BlendState.getState(); -//$$ if (blendState != null) { -//$$ blendState.get(ModelRendererExporter.class).onRenderModel(); -//$$ } -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinMouse.java b/src/main/java/com/replaymod/mixin/MixinMouse.java index e3f3ef45..ecedc81b 100644 --- a/src/main/java/com/replaymod/mixin/MixinMouse.java +++ b/src/main/java/com/replaymod/mixin/MixinMouse.java @@ -1,9 +1,6 @@ -//#if MC>=11400 package com.replaymod.mixin; import com.replaymod.core.events.KeyBindingEventCallback; -import com.replaymod.core.events.KeyEventCallback; -import net.minecraft.client.KeyboardListener; import net.minecraft.client.MouseHelper; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -17,4 +14,3 @@ private void afterKeyBindingTick(CallbackInfo ci) { KeyBindingEventCallback.EVENT.invoker().onKeybindingEvent(); } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinMouseHelper.java b/src/main/java/com/replaymod/mixin/MixinMouseHelper.java index d258ca18..3c840b0d 100644 --- a/src/main/java/com/replaymod/mixin/MixinMouseHelper.java +++ b/src/main/java/com/replaymod/mixin/MixinMouseHelper.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.mixin; import com.replaymod.replay.InputReplayTimer; @@ -33,11 +32,7 @@ private void handleReplayModScroll( long _p0, double _p1, double _p2, CallbackInfo ci, double _l1, - //#if MC>=11400 float yOffsetAccumulated - //#else - //$$ double yOffsetAccumulated - //#endif ) { if (ReplayModReplay.instance.getReplayHandler() != null) { InputReplayTimer.handleScroll((int) (yOffsetAccumulated * 120)); @@ -45,4 +40,3 @@ private void handleReplayModScroll( } } } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinMouseListener.java b/src/main/java/com/replaymod/mixin/MixinMouseListener.java index 8cd9abcc..e69de29b 100644 --- a/src/main/java/com/replaymod/mixin/MixinMouseListener.java +++ b/src/main/java/com/replaymod/mixin/MixinMouseListener.java @@ -1,55 +0,0 @@ -//#if FABRIC>=1 -//$$ package com.replaymod.mixin; -//$$ -//$$ import com.replaymod.gui.versions.callbacks.MouseCallback; -//$$ import net.minecraft.client.Mouse; -//$$ import net.minecraft.client.gui.Element; -//$$ import net.minecraft.client.gui.screen.Screen; -//$$ import org.spongepowered.asm.mixin.Mixin; -//$$ import org.spongepowered.asm.mixin.gen.Accessor; -//$$ import org.spongepowered.asm.mixin.injection.At; -//$$ import org.spongepowered.asm.mixin.injection.Inject; -//$$ import org.spongepowered.asm.mixin.injection.Redirect; -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ -//$$ @Mixin(Mouse.class) -//$$ public abstract class MixinMouseListener { -//$$ @Accessor // Note: for some reason Mixin doesn't include this in the refmap json if it's just a @Shadow field -//$$ abstract int getActiveButton(); -//$$ -//$$ @Inject(method = "method_1611", at = @At("HEAD"), cancellable = true) -//$$ private void mouseDown(boolean[] result, double x, double y, int button, CallbackInfo ci) { -//$$ if (com.replaymod.gui.versions.callbacks.MouseCallback.EVENT.invoker().mouseDown(x, y, button)) { -//$$ result[0] = true; -//$$ ci.cancel(); -//$$ } -//$$ } -//$$ -//$$ @Inject(method = "method_1605", at = @At("HEAD"), cancellable = true) -//$$ private void mouseUp(boolean[] result, double x, double y, int button, CallbackInfo ci) { -//$$ if (com.replaymod.gui.versions.callbacks.MouseCallback.EVENT.invoker().mouseUp(x, y, button)) { -//$$ result[0] = true; -//$$ ci.cancel(); -//$$ } -//$$ } -//$$ -//$$ @Inject(method = "method_1602", at = @At("HEAD"), cancellable = true) -//$$ private void mouseDrag(Element element, double x, double y, double dx, double dy, CallbackInfo ci) { -//$$ if (com.replaymod.gui.versions.callbacks.MouseCallback.EVENT.invoker().mouseDrag(x, y, getActiveButton(), dx, dy)) { -//$$ ci.cancel(); -//$$ } -//$$ } -//$$ -//$$ @Redirect( -//$$ method = "onMouseScroll", -//$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;mouseScrolled(DDD)Z") -//$$ ) -//$$ private boolean mouseScroll(Screen element, double x, double y, double scroll) { -//$$ if (MouseCallback.EVENT.invoker().mouseScroll(x, y, scroll)) { -//$$ return true; -//$$ } else { -//$$ return element.mouseScrolled(x, y, scroll); -//$$ } -//$$ } -//$$ } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java b/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java index 4e1a5274..10f2bb6d 100644 --- a/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java +++ b/src/main/java/com/replaymod/mixin/MixinNetHandlerLoginClient.java @@ -16,10 +16,11 @@ @Mixin(ClientLoginNetHandler.class) public abstract class MixinNetHandlerLoginClient { - @Final @Shadow + @Final + @Shadow private NetworkManager networkManager; - @Inject(method = "handleLoginSuccess", at=@At("HEAD")) + @Inject(method = "handleLoginSuccess", at = @At("HEAD")) public void replayModRecording_initiateRecording(CallbackInfo cb) { initiateRecording(null); } @@ -29,7 +30,7 @@ public void replayModRecording_initiateRecording(CallbackInfo cb) { * We cannot use the {@link FMLNetworkEvent.ClientConnectedToServerEvent} * as it only fires after the forge handshake. */ - @Inject(method = "handleCustomPayloadLogin", at=@At("HEAD")) + @Inject(method = "handleCustomPayloadLogin", at = @At("HEAD")) public void replayModRecording_initiateRecording(SCustomPayloadLoginPacket packetIn, CallbackInfo cb) { initiateRecording(packetIn); } diff --git a/src/main/java/com/replaymod/mixin/MixinNetHandlerPlayClient.java b/src/main/java/com/replaymod/mixin/MixinNetHandlerPlayClient.java index 207c09b1..d66b3fb4 100644 --- a/src/main/java/com/replaymod/mixin/MixinNetHandlerPlayClient.java +++ b/src/main/java/com/replaymod/mixin/MixinNetHandlerPlayClient.java @@ -2,8 +2,16 @@ import com.replaymod.core.versions.MCVer; import com.replaymod.recording.handler.RecordingEventHandler; +import com.replaymod.replaystudio.protocol.Packet; +import com.replaymod.replaystudio.protocol.PacketType; +import com.replaymod.replaystudio.protocol.packets.PacketPlayerListEntry; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import net.minecraft.client.Minecraft; import net.minecraft.client.network.play.ClientPlayNetHandler; +import net.minecraft.client.network.play.NetworkPlayerInfo; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.server.SPlayerListItemPacket; import net.minecraft.network.play.server.SRespawnPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -11,22 +19,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#if MC>=10800 -import com.replaymod.replaystudio.protocol.Packet; -import com.replaymod.replaystudio.protocol.PacketType; -import com.replaymod.replaystudio.protocol.packets.PacketPlayerListEntry; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.server.SPlayerListItemPacket; -import net.minecraft.client.network.play.NetworkPlayerInfo; - import java.io.IOException; import java.util.Map; import java.util.UUID; -//#else -//$$ import net.minecraft.network.play.server.S01PacketJoinGame; -//#endif @Mixin(ClientPlayNetHandler.class) public abstract class MixinNetHandlerPlayClient { @@ -34,10 +29,8 @@ public abstract class MixinNetHandlerPlayClient { // The stupid name is required as otherwise Mixin treats it as a shadow, seemingly ignoring the lack of @Shadow private static Minecraft mcStatic = MCVer.getMinecraft(); - //#if MC>=10800 @Shadow private Map playerInfoMap; - //#endif public RecordingEventHandler getRecordingEventHandler() { return ((RecordingEventHandler.RecordingEventSender) mcStatic.worldRenderer).getRecordingEventHandler(); @@ -47,15 +40,11 @@ public RecordingEventHandler getRecordingEventHandler() { * Record the own player entity joining the world. * We cannot use the {@link net.minecraftforge.event.entity.EntityJoinWorldEvent} because the entity id * of the player is set afterwards and the tablist entry might not yet be sent. + * * @param packet The packet - * @param ci Callback info + * @param ci Callback info */ - //#if MC>=10800 - //#if FABRIC>=1 - //$$ @Inject(method = "onPlayerList", at=@At("HEAD")) - //#else - @Inject(method = "handlePlayerListItem", at=@At("HEAD")) - //#endif + @Inject(method = "handlePlayerListItem", at = @At("HEAD")) public void recordOwnJoin(SPlayerListItemPacket packet, CallbackInfo ci) { if (!mcStatic.isOnExecutionThread()) return; if (mcStatic.player == null) return; @@ -91,28 +80,16 @@ public void recordOwnJoin(SPlayerListItemPacket packet, CallbackInfo ci) { } } } - //#else - //$$ @Inject(method = "handleJoinGame", at=@At("RETURN")) - //$$ public void recordOwnJoin(S01PacketJoinGame packet, CallbackInfo ci) { - //$$ RecordingEventHandler handler = getRecordingEventHandler(); - //$$ if (handler != null) { - //$$ handler.spawnRecordingPlayer(); - //$$ } - //$$ } - //#endif /** * 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 the above method. + * * @param packet The packet - * @param ci Callback info + * @param ci Callback info */ - //#if FABRIC>=1 - //$$ @Inject(method = "onPlayerRespawn", at=@At("RETURN")) - //#else - @Inject(method = "handleRespawn", at=@At("RETURN")) - //#endif + @Inject(method = "handleRespawn", at = @At("RETURN")) public void recordOwnRespawn(SRespawnPacket packet, CallbackInfo ci) { RecordingEventHandler handler = getRecordingEventHandler(); if (handler != null) { diff --git a/src/main/java/com/replaymod/mixin/MixinParticleManager.java b/src/main/java/com/replaymod/mixin/MixinParticleManager.java index a546ff41..f11cf926 100644 --- a/src/main/java/com/replaymod/mixin/MixinParticleManager.java +++ b/src/main/java/com/replaymod/mixin/MixinParticleManager.java @@ -1,34 +1,21 @@ package com.replaymod.mixin; -//#if MC>=10904 +import com.mojang.blaze3d.vertex.IVertexBuilder; import com.replaymod.core.versions.MCVer; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.ParticlesExporter; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleManager; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.util.math.vector.Quaternion; import net.minecraft.util.math.vector.Vector3d; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -//#if MC>=11500 -import com.mojang.blaze3d.vertex.IVertexBuilder; -import net.minecraft.util.math.vector.Quaternion; -//#else -//$$ import com.replaymod.render.blend.mixin.ParticleAccessor; -//$$ import net.minecraft.client.render.BufferBuilder; -//#endif - -//#if MC>=11400 -import net.minecraft.client.renderer.ActiveRenderInfo; -//#else -//$$ import net.minecraft.entity.Entity; -//#endif - @Mixin(ParticleManager.class) public abstract class MixinParticleManager { - //#if MC>=11500 @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lcom/mojang/blaze3d/vertex/IVertexBuilder;Lnet/minecraft/client/renderer/ActiveRenderInfo;F)V")) private void buildOrientedGeometry(Particle particle, IVertexBuilder vertexConsumer, ActiveRenderInfo camera, float partialTicks) { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); @@ -58,71 +45,4 @@ private void buildGeometry(Particle particle, IVertexBuilder vertexConsumer, Act } particle.renderParticle(vertexConsumer, camera, partialTicks); } - //#else - //#if MC>=11200 - //#if MC>=11400 - //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;buildGeometry(Lnet/minecraft/client/render/BufferBuilder;Lnet/minecraft/client/render/Camera;FFFFFF)V")) - //$$ private void renderNormalParticle(Particle particle, BufferBuilder vertexBuffer, Camera view, float partialTicks, - //#else - //$$ @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lnet/minecraft/client/renderer/BufferBuilder;Lnet/minecraft/entity/Entity;FFFFFF)V")) - //$$ private void renderNormalParticle(Particle particle, BufferBuilder vertexBuffer, Entity view, float partialTicks, - //#endif - //#else - //$$ @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, - //#endif - //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - //$$ renderParticle(particle, vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - //$$ } - //$$ - //$$ // Seems to be gone by 1.14 - //#if MC<11400 - //#if MC>=11200 - //$$ @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lnet/minecraft/client/renderer/BufferBuilder;Lnet/minecraft/entity/Entity;FFFFFF)V")) - //$$ private void renderLitParticle(Particle particle, BufferBuilder vertexBuffer, Entity view, float partialTicks, - //#else - //$$ @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, - //#endif - //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - //$$ renderParticle(particle, vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - //$$ } - //#endif - //$$ - //$$ private void renderParticle(Particle particle, - //$$ BufferBuilder vertexBuffer, - //#if MC>=11400 - //$$ Camera view, - //#else - //$$ Entity view, - //#endif - //$$ float partialTicks, - //$$ float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - //$$ EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); - //$$ if (handler != null && handler.omnidirectional) { - //$$ // Align all particles towards the camera - //#if MC>=11400 - //$$ Vec3d pos = view.getPos(); - //#else - //$$ Vec3d pos = new Vec3d(view.posX, view.posY, view.posZ); - //#endif - //$$ Vec3d d = MCVer.getPosition(particle, partialTicks).subtract(pos); - //$$ double pitch = -Math.atan2(d.y, Math.sqrt(d.x * d.x + d.z * d.z)); - //$$ double yaw = -Math.atan2(d.x, d.z); - //$$ - //$$ 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)); - //$$ } - //$$ BlendState blendState = BlendState.getState(); - //$$ if (blendState != null) { - //$$ blendState.get(ParticlesExporter.class).onRender(particle, partialTicks); - //$$ } - //$$ particle.buildGeometry(vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - //$$ } - //#endif } -//#endif diff --git a/src/main/java/com/replaymod/mixin/MixinRender.java b/src/main/java/com/replaymod/mixin/MixinRender.java index 04096518..f50f0d64 100644 --- a/src/main/java/com/replaymod/mixin/MixinRender.java +++ b/src/main/java/com/replaymod/mixin/MixinRender.java @@ -9,32 +9,26 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Coerce; import org.spongepowered.asm.mixin.injection.Inject; - -//#if MC>=10800 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#else -//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#endif /** * This mixin prevents players that are hidden in the PlayerOverview from being rendered. - * + *