diff --git a/build.gradle.kts b/build.gradle.kts index 55bd595b..5b25ecb8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,9 +1,10 @@ import com.replaymod.gradle.preprocess.PreprocessTask import gg.essential.gradle.util.* +import net.fabricmc.loom.task.RemapJarTask plugins { java - id("io.github.goooler.shadow") apply false + id("com.gradleup.shadow") apply false id("gg.essential.multi-version") id("gg.essential.defaults.repo") id("gg.essential.defaults.java") @@ -22,10 +23,14 @@ base.archivesName.set("replaymod") java.withSourcesJar() loom { - mixin.defaultRefmapName.set("mixins.replaymod.refmap.json") noServerRunConfigs() } +if (!platform.isUnobfuscated) { + loom.mixin.useLegacyMixinAp = true + loom.mixin.defaultRefmapName.set("mixins.replaymod.refmap.json") +} + if (platform.isLegacyForge) { loom.runs.named("client") { property("fml.coreMods.load", "com.replaymod.core.LoadingPlugin") @@ -93,6 +98,7 @@ dependencies { 12107 -> "0.128.1+1.21.7" 12110 -> "0.135.0+1.21.10" 12111 -> "0.139.5+1.21.11" + 26_01_00 -> "0.144.3+26.1" else -> throw UnsupportedOperationException() } val fabricApiModules = mutableListOf( @@ -115,6 +121,10 @@ dependencies { if (mcVersion >= 12109) { fabricApiModules.add("resource-loader-v1") } + if (mcVersion >= 26_01_00) { + fabricApiModules.remove("key-binding-api-v1") + fabricApiModules.add("key-mapping-api-v1") + } for (module in fabricApiModules) { val dep = fabricApi.module("fabric-$module", fabricApiVersion) modImplementation(dep) @@ -169,11 +179,12 @@ dependencies { // FIXME hack because I don't know how to get this to be inherited properly implementation(rootProject.files("libs/ReplayStudio/.gradle/prebundled-jars/viaVersion.jar")) - implementation(project(path = jGui.path, configuration = "namedElements")) + implementation(project(path = jGui.path, configuration = if (platform.isUnobfuscated) null else "namedElements")) implementation(shadow("com.github.ReplayMod:lwjgl-utils:27dcd66")!!) if (platform.isFabric) { val modMenuVersion = when { + mcVersion >= 26_01_00 -> "18.0.0-alpha.8" mcVersion >= 12111 -> "17.0.0-alpha.1" mcVersion >= 12110 -> "16.0.0-rc.1" mcVersion >= 12107 -> "15.0.0-beta.3" @@ -210,6 +221,7 @@ dependencies { } val irisVersion = when { + mcVersion >= 26_01_00 -> "1.10.8+26.1-fabric" mcVersion >= 12000 -> "1.7.2+1.20.1" mcVersion >= 11600 -> "1.18.x-v1.2.0" else -> null @@ -251,11 +263,13 @@ tasks.jar { } } -tasks.remapJar { - if (platform.isFabric) { - addNestedDependencies.set(true) +if (!platform.isUnobfuscated) { + tasks.named("remapJar") { + if (platform.isFabric) { + addNestedDependencies.set(true) + } + archiveClassifier.set("obf") } - archiveClassifier.set("obf") } val configureRelocationOutput = project.layout.buildDirectory.file("configureRelocation") @@ -318,9 +332,9 @@ val configureRelocation by tasks.registering { } val bundleJar by tasks.registering(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) { - from(tasks.remapJar.flatMap { it.archiveFile }) + from((if (platform.isUnobfuscated) tasks.jar else tasks.named("remapJar")).flatMap { it.archiveFile }.map { zipTree(it) }) - from(jGui.tasks.remapJar.flatMap { it.archiveFile }.map { zipTree(it) }) { + from((if (platform.isUnobfuscated) jGui.tasks.jar else jGui.tasks.named("remapJar")).flatMap { it.archiveFile }.map { zipTree(it) }) { filesMatching("mixins.jgui.json") { filter { it.replace("de.johni0702", "com.replaymod.lib.de.johni0702") } } @@ -330,8 +344,8 @@ val bundleJar by tasks.registering(com.github.jengelman.gradle.plugins.shadow.ta } relocate("de.johni0702", "com.replaymod.lib.de.johni0702") - manifest.inheritFrom(tasks.jar.get().manifest) - from(shade) + manifest.from(tasks.jar.get().manifest) + from(shade.elements.map { it.map { zipTree(it) } }) configurations = listOf(shadow) exclude("META-INF/INDEX.LIST", "META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA", "module-info.class") diff --git a/gradle.properties b/gradle.properties index 0412aa14..17ae14af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ essential.defaults.loom=0 -essential.defaults.loom.fabric-loader=net.fabricmc:fabric-loader:0.18.2 +essential.defaults.loom.fabric-loader=net.fabricmc:fabric-loader:0.18.5 # 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. diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d184210..221c4f98 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/jGui b/jGui index 985836c3..b0e06838 160000 --- a/jGui +++ b/jGui @@ -1 +1 @@ -Subproject commit 985836c3d026b10b429828375d89c8b275c5eb52 +Subproject commit b0e068383c881f393b975bba60acbda2f29af9c2 diff --git a/libs/ReplayStudio b/libs/ReplayStudio index 526f9aaf..ca00f810 160000 --- a/libs/ReplayStudio +++ b/libs/ReplayStudio @@ -1 +1 @@ -Subproject commit 526f9aaf43fb49f66068dcb32e0253008df17bb1 +Subproject commit ca00f8101bec034efe77bdb938522aa3b800cf50 diff --git a/root.gradle.kts b/root.gradle.kts index b78aec61..7443135e 100755 --- a/root.gradle.kts +++ b/root.gradle.kts @@ -1,31 +1,43 @@ import groovy.json.JsonOutput import java.io.ByteArrayOutputStream +import org.gradle.kotlin.dsl.support.serviceOf +import org.gradle.process.ExecOperations plugins { id("gg.essential.multi-version.root") - id("gg.essential.loom") version "1.7.35" apply false + id("gg.essential.loom") version "1.15.48" apply false + kotlin("jvm") version "2.3.20" apply false 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() +var releaseCommit = providers.exec { + commandLine("git", "blame", "-p", "-l", "version.txt") +}.standardOutput.asText.map { it.trim().split("/n").first().split(" ").first() }.get() 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() +val currentCommit = providers.exec { + commandLine("git", "rev-parse", "HEAD") +}.standardOutput.asText.map { it.trim().split("/n").first() }.get() if (releaseCommit == currentCommit) { version = latestVersion } else { - val diff = command("git", "log", "--format=oneline", "$releaseCommit..$currentCommit").size + val diff = providers.exec { + commandLine("git", "log", "--format=oneline", "$releaseCommit..$currentCommit") + }.standardOutput.asText.map { it.trim().split("/n").size }.get() version = "$latestVersion-$diff-g${currentCommit.substring(0, 7)}" } -if (gitDescribe().endsWith("*")) { +val dirty = providers.exec { + commandLine("git", "describe", "--always", "--dirty=*") +}.standardOutput.asText.map { it.trim().endsWith("*") }.get() +if (dirty) { version = "$version-dirty" } group = "com.replaymod" -val bundleJar by tasks.creating(Copy::class) { +val bundleJar by tasks.registering(Copy::class) { into("$buildDir/libs") } @@ -38,33 +50,23 @@ subprojects { if (name == "jGui" || name == "ReplayStudio") { return@subprojects } - val (_, minor) = name.split("-")[0].split(".") - val fabric = minor.toInt() >= 14 && !name.endsWith("-forge") + val (major, minor, patch) = name.split("-")[0].split(".") + listOf("0") + val mcVersion = major.toInt() * 10000 + minor.toInt() * 100 + patch.toInt() + val fabric = mcVersion >= 1_14_00 && !name.endsWith("-forge") extra.set("loom.platform", if (fabric) "fabric" else "forge") afterEvaluate { val projectBundleJar = project.tasks.findByName("bundleJar") if (projectBundleJar != null && projectBundleJar.hasProperty("archivePath") && project.name != "core") { - bundleJar.dependsOn(projectBundleJar) - bundleJar.from(projectBundleJar.withGroovyBuilder { getProperty("archivePath") }) + bundleJar.configure { + dependsOn(projectBundleJar) + from(projectBundleJar.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 { +fun ExecOperations.command(vararg cmd: String): List { val stdout = ByteArrayOutputStream() exec { commandLine(*cmd) @@ -73,7 +75,10 @@ fun command(vararg cmd: Any): List { return stdout.toString().trim().split("\n") } -fun generateVersionsJson(): Map { +fun generateVersionsJson(execOps: ExecOperations): Map { + fun command(vararg cmd: String): List = + execOps.command(*cmd) + val versionComparator = compareBy( { (it.split(".").getOrNull(0) ?: "0").toInt() }, { (it.split(".").getOrNull(1) ?: "0").toInt() }, @@ -145,18 +150,24 @@ fun generateVersionsJson(): Map { } val writeVersionsJson by tasks.registering { + val execOps = project.serviceOf() doLast { - val versionsRoot = generateVersionsJson() + val versionsRoot = generateVersionsJson(execOps) val versionsJson = JsonOutput.prettyPrint(JsonOutput.toJson(versionsRoot)) File("versions.json").writeText(versionsJson) } } val doRelease by tasks.registering { + val execOps = project.serviceOf() + doLast { + fun command(vararg cmd: String): List = + execOps.command(*cmd) + // Parse version val version = project.extra["releaseVersion"] as String - if (gitDescribe().endsWith("*")) { + if (command("git", "describe", "--always", "--dirty=*").first().endsWith("*")) { throw InvalidUserDataException("Git working tree is dirty. Make sure to commit all changes.") } val (modVersion, preVersion) = if ("-b" in version) { @@ -181,7 +192,7 @@ val doRelease by tasks.registering { command("git", "commit", "-m", commitMessage) // Generate versions.json content - val versionsRoot = generateVersionsJson() + val versionsRoot = generateVersionsJson(execOps) val versionsJson = JsonOutput.prettyPrint(JsonOutput.toJson(versionsRoot)) // Switch to master branch to update versions.json @@ -191,11 +202,11 @@ val doRelease by tasks.registering { 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") } + command("git", "add", "versions.json") + command("git", "commit", "-m", "Update versions.json for $version") // Return to previous branch - project.exec { commandLine("git", "checkout", "-") } + command("git", "checkout", "-") } } @@ -204,6 +215,7 @@ defaultTasks("bundleJar") preprocess { strictExtraMappings.set(true) + val mc26_01_00 = createNode("26.1", 26_01_00, "yarn") val mc12111 = createNode("1.21.11", 12111, "yarn") val mc12110 = createNode("1.21.10", 12110, "yarn") val mc12107 = createNode("1.21.7", 12107, "yarn") @@ -239,6 +251,7 @@ preprocess { val mc10800 = createNode("1.8", 10800, "srg") val mc10710 = createNode("1.7.10", 10710, "srg") + mc26_01_00.link(mc12111, file("versions/mapping-fabric-26.1-1.21.11.txt")) mc12111.link(mc12110, file("versions/mapping-fabric-1.21.11-1.21.10.txt")) mc12110.link(mc12107, file("versions/mapping-fabric-1.21.10-1.21.7.txt")) mc12107.link(mc12105) diff --git a/settings.gradle.kts b/settings.gradle.kts index dc286747..5b4f0938 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,8 +11,8 @@ pluginManagement { maven("https://repo.essential.gg/repository/maven-public") } plugins { - id("gg.essential.multi-version.root") version "0.6.7" - id("io.github.goooler.shadow") version "8.1.7" + id("gg.essential.multi-version.root") version "0.7.0-alpha.4" + id("com.gradleup.shadow") version "9.4.1" } } @@ -46,6 +46,7 @@ val jGuiVersions = listOf( "1.21.7", "1.21.10", "1.21.11", + "26.1", ) val replayModVersions = listOf( // "1.7.10", @@ -82,6 +83,7 @@ val replayModVersions = listOf( "1.21.7", "1.21.10", "1.21.11", + "26.1", ) rootProject.buildFileName = "root.gradle.kts" diff --git a/src/main/java/com/replaymod/core/mixin/BlockableEventLoopAccessor.java b/src/main/java/com/replaymod/core/mixin/BlockableEventLoopAccessor.java new file mode 100644 index 00000000..1c8b2ed0 --- /dev/null +++ b/src/main/java/com/replaymod/core/mixin/BlockableEventLoopAccessor.java @@ -0,0 +1 @@ +// 26.1+ diff --git a/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java b/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java index 2dec6328..e810c650 100644 --- a/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java +++ b/src/main/java/com/replaymod/core/mixin/MinecraftAccessor.java @@ -57,12 +57,16 @@ public interface MinecraftAccessor { //$$ Queue> getScheduledTasks(); //#endif + //#if MC >= 26.1 + //$$ // Now in BlockableEventLoopAccessor + //#else @Accessor("crashReport") //#if MC>=11800 //$$ Supplier getCrashReporter(); //#else CrashReport getCrashReporter(); //#endif + //#endif //#if MC<11400 //$$ @Accessor diff --git a/src/main/java/com/replaymod/core/mixin/MixinMinecraft.java b/src/main/java/com/replaymod/core/mixin/MixinMinecraft.java index 2ed8c67e..9a3a043b 100644 --- a/src/main/java/com/replaymod/core/mixin/MixinMinecraft.java +++ b/src/main/java/com/replaymod/core/mixin/MixinMinecraft.java @@ -34,10 +34,6 @@ public abstract class MixinMinecraft extends ReentrantThreadExecutor //#endif implements MCVer.MinecraftMethodAccessor { - //#if MC>=11400 - public MixinMinecraft(String string_1) { super(string_1); } - //#endif - //#if MC>=11400 @Shadow protected abstract void handleInputEvents(); @@ -59,7 +55,9 @@ public abstract class MixinMinecraft } //#endif - //#if MC>=12100 + //#if MC >= 26.1 + //$$ private static final String GAME_RENDERER_RENDER = "Lnet/minecraft/client/Minecraft;renderFrame(Z)V"; + //#elseif MC>=12100 //$$ private static final String GAME_RENDERER_RENDER = "Lnet/minecraft/client/render/GameRenderer;render(Lnet/minecraft/client/render/RenderTickCounter;Z)V"; //#else private static final String GAME_RENDERER_RENDER = "Lnet/minecraft/client/render/GameRenderer;render(FJZ)V"; @@ -136,4 +134,10 @@ public abstract class MixinMinecraft //$$ return wheel; //$$ } //#endif + + //#if MC >= 26.1 + //$$ MixinMinecraft() { super(null, false); } + //#elseif MC>=11400 + MixinMinecraft() { super(null); } + //#endif } diff --git a/src/main/java/com/replaymod/core/mixin/Mixin_PostRenderWorldCalback.java b/src/main/java/com/replaymod/core/mixin/Mixin_PostRenderWorldCalback.java index 641749c5..19914921 100644 --- a/src/main/java/com/replaymod/core/mixin/Mixin_PostRenderWorldCalback.java +++ b/src/main/java/com/replaymod/core/mixin/Mixin_PostRenderWorldCalback.java @@ -20,10 +20,11 @@ public class Mixin_PostRenderWorldCalback { //$$ private void postRenderWorld(CallbackInfo ci) { //$$ MatrixStack matrixStack = new MatrixStack(); //#else - @Inject(method = "render", at = @At("RETURN")) //#if MC>=11500 + @Inject(method = "render", at = @At("RETURN")) private void postRenderWorld(CallbackInfo ci, @Local(argsOnly = true) MatrixStack matrixStack) { //#else + //$$ @Inject(method = "render", at = @At("RETURN")) //$$ private void postRenderWorld(CallbackInfo ci) { //$$ MatrixStack matrixStack = new MatrixStack(); //#endif diff --git a/src/main/java/com/replaymod/core/versions/Patterns.java b/src/main/java/com/replaymod/core/versions/Patterns.java index 64fdc4d2..954c0b61 100644 --- a/src/main/java/com/replaymod/core/versions/Patterns.java +++ b/src/main/java/com/replaymod/core/versions/Patterns.java @@ -630,13 +630,24 @@ class Patterns { @Pattern private static CrashException crashReportToException(MinecraftClient mc) { - //#if MC>=11800 + //#if MC >= 26.1 + //$$ return new ReportedException(((com.replaymod.core.mixin.BlockableEventLoopAccessor) mc).getDelayedCrash().get()); + //#elseif MC>=11800 //$$ return new CrashException(((MinecraftAccessor) mc).getCrashReporter().get()); //#else return new CrashException(((MinecraftAccessor) mc).getCrashReporter()); //#endif } + @Pattern + private static boolean haveDelayedCrash(MinecraftClient mc) { + //#if MC >= 26.1 + //$$ return ((com.replaymod.core.mixin.BlockableEventLoopAccessor) mc).getDelayedCrash() != null; + //#else + return ((MinecraftAccessor) mc).getCrashReporter() != null; + //#endif + } + @Pattern private static Vec3d getTrackedPosition(Entity entity) { //#if MC>=11604 @@ -936,10 +947,7 @@ class Patterns { //#endif } - //#if MC>=10904 - //#if MC>=12006 - //$$ @Pattern public void getPacketId() {} - //#else + //#if MC>=10904 && MC<12006 @Pattern public Integer getPacketId(NetworkState state, NetworkSide side, Packet packet) throws Exception { //#if MC>=12002 @@ -948,8 +956,11 @@ class Patterns { return state.getPacketId(side, packet); //#endif } + //#else + //$$ @Pattern public void getPacketId() {} //#endif + //#if MC>=10904 && MC < 26.1 @Pattern public int UnloadChunkPacket_getX(UnloadChunkS2CPacket packet) { //#if MC>=12002 @@ -968,7 +979,6 @@ class Patterns { //#endif } //#else - //$$ @Pattern public void getPacketId() {} //$$ @Pattern public void UnloadChunkPacket_getZ() {} //$$ @Pattern public void UnloadChunkPacket_getX() {} //#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 3329f24e..9d655d0c 100644 --- a/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java +++ b/src/main/java/com/replaymod/core/versions/scheduler/SchedulerImpl.java @@ -61,7 +61,11 @@ public class SchedulerImpl implements Scheduler { private final Thread mcThread = Thread.currentThread(); private ReplayModExecutor(String string_1) { + //#if MC >= 26.1 + //$$ super(string_1, false); + //#else super(string_1); + //#endif } @Override public Runnable createTask(Runnable runnable) { diff --git a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java index db650995..6121f604 100644 --- a/src/main/java/com/replaymod/pathing/player/ReplayTimer.java +++ b/src/main/java/com/replaymod/pathing/player/ReplayTimer.java @@ -27,25 +27,27 @@ public class ReplayTimer extends RenderTickCounter { @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 + //#if MC >= 26.1 + //$$ advanceGameTime( + //#elseif MC >= 1.14 beginRenderTick( //#else - //$$ public void updateTimer( + //$$ updateTimer( //#endif //#if MC>=11400 long sysClock //#endif - //#if MC>=12100 + //#if MC>=12100 && MC < 26.1 //$$ , boolean tick //#endif ) { - //#if MC>=12100 + //#if MC>=12100 && MC < 26.1 //$$ if (!tick) return 0; //#endif UpdatedCallback.EVENT.invoker().onUpdate(); diff --git a/src/main/java/com/replaymod/render/blend/Util.java b/src/main/java/com/replaymod/render/blend/Util.java index 95545851..1b599c27 100644 --- a/src/main/java/com/replaymod/render/blend/Util.java +++ b/src/main/java/com/replaymod/render/blend/Util.java @@ -185,6 +185,8 @@ public class Util { } } + //#if MC >= 26.1 + //#else public static String getTileEntityId(BlockEntity tileEntity) { //#if MC>=12006 //$$ return net.minecraft.block.entity.BlockEntityType.getId(tileEntity.getType()).toString(); @@ -202,6 +204,7 @@ public class Util { return nbt.getString("id"); //#endif } + //#endif public interface IOCallable { R call() throws IOException; diff --git a/src/main/java/com/replaymod/render/blend/mixin/MixinRenderLivingBase.java b/src/main/java/com/replaymod/render/blend/mixin/MixinRenderLivingBase.java index fa247467..8a355848 100644 --- a/src/main/java/com/replaymod/render/blend/mixin/MixinRenderLivingBase.java +++ b/src/main/java/com/replaymod/render/blend/mixin/MixinRenderLivingBase.java @@ -21,7 +21,7 @@ import net.minecraft.client.render.entity.LivingEntityRenderer; //#endif public abstract class MixinRenderLivingBase { //#if MC>=11500 - @Inject(method = "render", at = @At( + @Inject(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At( //#else //#if FABRIC>=1 //$$ @Inject(method = "render(Lnet/minecraft/entity/LivingEntity;DDDFF)V", at = @At( diff --git a/src/main/java/com/replaymod/render/gui/progress/VirtualWindow.java b/src/main/java/com/replaymod/render/gui/progress/VirtualWindow.java index 3b7660a6..b9792945 100644 --- a/src/main/java/com/replaymod/render/gui/progress/VirtualWindow.java +++ b/src/main/java/com/replaymod/render/gui/progress/VirtualWindow.java @@ -7,6 +7,10 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.util.Window; +//#if MC >= 26.1 +//$$ import com.mojang.blaze3d.systems.RenderSystem; +//#endif + //#if MC>=11700 //$$ import net.minecraft.client.gl.WindowFramebuffer; //#endif @@ -88,7 +92,9 @@ public class VirtualWindow implements Closeable { guiFramebuffer.draw(framebufferWidth, framebufferHeight); //#endif - //#if MC>=12102 + //#if MC >= 26.1 + //$$ RenderSystem.flipFrame(null); + //#elseif MC>=12102 //$$ window.swapBuffers(null); //#elseif MC>=11500 window.swapBuffers(); diff --git a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java index fabf0fd1..9e7d9124 100644 --- a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java +++ b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java @@ -14,7 +14,7 @@ import de.johni0702.minecraft.gui.utils.EventRegistrations; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; -//#if MC>=12111 +//#if MC>=12111 && MC < 26.1 //$$ import net.minecraft.client.render.CameraOverride; //$$ import org.joml.Vector3f; //#endif @@ -93,7 +93,8 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer; Screen orgScreen = mc.currentScreen; boolean orgPauseOnLostFocus = mc.options.pauseOnLostFocus; - //#if MC>=12106 + //#if MC >= 26.1 + //#elseif MC>=12106 //$$ boolean orgRenderHand = mc.gameRenderer.isRenderingPanorama(); //#else boolean orgRenderHand = gameRenderer.getRenderHand(); @@ -103,7 +104,9 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe mc.options.pauseOnLostFocus = false; // do not want the pause menu to open if the window is unfocused if (omnidirectional) { // makes no sense, we wouldn't even know where to put it - //#if MC>=12111 + //#if MC >= 26.1 + //$$ mc.gameRenderer.getMainCamera().enablePanoramicMode(); + //#elseif MC>=12111 //$$ mc.gameRenderer.setCameraOverride(new CameraOverride(new Vector3f(mc.gameRenderer.getCamera().getHorizontalPlane()))); //#elseif MC>=12106 //$$ mc.gameRenderer.setRenderingPanorama(false); @@ -112,7 +115,11 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe //#endif } - //#if MC>=12100 + //#if MC >= 26.1 + //$$ mc.gameRenderer.update(mc.getDeltaTracker(), true); + //$$ mc.gameRenderer.extract(mc.getDeltaTracker(), true); + //$$ mc.gameRenderer.render(mc.getDeltaTracker(), true); + //#elseif MC>=12100 //$$ mc.gameRenderer.render(mc.getRenderTickCounter(), true); //#elseif MC>=11400 mc.gameRenderer.render(partialTicks, finishTimeNano, true); @@ -127,7 +134,9 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe } finally { mc.currentScreen = orgScreen; mc.options.pauseOnLostFocus = orgPauseOnLostFocus; - //#if MC>=12111 + //#if MC >= 26.1 + //$$ mc.gameRenderer.getMainCamera().disablePanoramicMode(); + //#elseif MC>=12111 //$$ mc.gameRenderer.setCameraOverride(null); //#elseif MC>=12106 //$$ mc.gameRenderer.setRenderingPanorama(orgRenderHand); diff --git a/src/main/java/com/replaymod/render/mixin/GameRendererAccessor.java b/src/main/java/com/replaymod/render/mixin/GameRendererAccessor.java index 1f6f09ed..2265321f 100644 --- a/src/main/java/com/replaymod/render/mixin/GameRendererAccessor.java +++ b/src/main/java/com/replaymod/render/mixin/GameRendererAccessor.java @@ -6,7 +6,6 @@ import org.spongepowered.asm.mixin.gen.Accessor; //#if MC>=12106 //$$ import net.minecraft.client.gui.render.GuiRenderer; -//$$ import net.minecraft.client.gui.render.state.GuiRenderState; //$$ import net.minecraft.client.render.fog.FogRenderer; //$$ import net.minecraft.client.util.Pool; //#endif @@ -25,8 +24,13 @@ public interface GameRendererAccessor { //$$ Pool getPool(); //$$ @Accessor //$$ GuiRenderer getGuiRenderer(); + //#if MC >= 26.1 //$$ @Accessor - //$$ GuiRenderState getGuiState(); + //$$ net.minecraft.client.renderer.state.GameRenderState getGameRenderState(); + //#else + //$$ @Accessor + //$$ net.minecraft.client.gui.render.state.GuiRenderState getGuiState(); + //#endif //$$ @Accessor //$$ FogRenderer getFogRenderer(); //#endif diff --git a/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags.java b/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags.java index 6377afda..080ba2ab 100644 --- a/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags.java +++ b/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags.java @@ -10,7 +10,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(EntityRenderer.class) public abstract class Mixin_HideNameTags { - //#if MC>=11500 + //#if MC >= 26.1 + //$$ @Inject(method = "submitNameDisplay(Lnet/minecraft/client/renderer/entity/state/EntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;I)V", at = @At("HEAD"), cancellable = true) + //#elseif MC>=11500 @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true) //#else //#if MC>=11400 diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index 5e4c5947..b2c8e2b6 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -40,6 +40,10 @@ import net.minecraft.util.crash.CrashException; import net.minecraft.sound.SoundCategory; import org.lwjgl.glfw.GLFW; +//#if MC >= 26.1 +//$$ import net.minecraft.client.renderer.state.WindowRenderState; +//#endif + //#if MC>=12109 //$$ import net.minecraft.client.gui.screen.Overlay; //#endif @@ -289,11 +293,15 @@ public class VideoRenderer implements RenderInfo { //#if MC>=11600 int elapsedTicks = //#endif + //#if MC >= 26.1 + //$$ timer.advanceGameTime( + //#else timer.beginRenderTick( + //#endif //#if MC>=11400 MCVer.milliTime() //#endif - //#if MC>=12100 + //#if MC>=12100 && MC < 26.1 //$$ , true //#endif ); @@ -508,6 +516,10 @@ public class VideoRenderer implements RenderInfo { } private void tick() { + //#if MC >= 1.21.11 + //$$ mc.getTextureManager().tick(); + //#endif + //#if MC>=10800 && MC<11400 //$$ try { //$$ mc.runTick(); @@ -525,6 +537,9 @@ public class VideoRenderer implements RenderInfo { if (GLFW.glfwWindowShouldClose(window.getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) { return false; } + //#if MC >= 26.1 + //$$ RenderSystem.pollEvents(); + //#endif pushMatrix(); //#if MC>=12105 @@ -630,7 +645,11 @@ public class VideoRenderer implements RenderInfo { //#if MC>=12106 //$$ GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer; + //#if MC >= 26.1 + //$$ GuiRenderState guiRenderState = gameRenderer.getGameRenderState().guiRenderState; + //#else //$$ GuiRenderState guiRenderState = gameRenderer.getGuiState(); + //#endif //$$ guiRenderState.clear(); //#if MC>=12111 //$$ DrawContext drawContext = new DrawContext(mc, guiRenderState, mouseX, mouseY); @@ -641,6 +660,16 @@ public class VideoRenderer implements RenderInfo { //$$ DrawContext drawContext = new DrawContext(mc, mc.getBufferBuilders().getEntityVertexConsumers()); //#endif + //#if MC >= 26.1 + //$$ WindowRenderState windowRenderState = gameRenderer.getGameRenderState().windowRenderState; + //$$ windowRenderState.width = window.getWidth(); + //$$ windowRenderState.height = window.getHeight(); + //$$ windowRenderState.guiScale = window.getGuiScale(); + //$$ windowRenderState.appropriateLineWidth = window.getAppropriateLineWidth(); + //$$ windowRenderState.isMinimized = window.isMinimized(); + //$$ windowRenderState.isResized = false; + //#endif + if (mc.getOverlay() != null) { Screen orgScreen = mc.currentScreen; try { diff --git a/src/main/java/com/replaymod/replay/FullReplaySender.java b/src/main/java/com/replaymod/replay/FullReplaySender.java index 521078e2..b4bb975d 100644 --- a/src/main/java/com/replaymod/replay/FullReplaySender.java +++ b/src/main/java/com/replaymod/replay/FullReplaySender.java @@ -1420,8 +1420,13 @@ public class FullReplaySender extends ChannelInboundHandlerAdapter implements Re //#if MC>=10904 if (p instanceof UnloadChunkS2CPacket) { UnloadChunkS2CPacket packet = (UnloadChunkS2CPacket) p; + //#if MC >= 26.1 + //$$ int x = packet.pos().x(); + //$$ int z = packet.pos().z(); + //#else int x = packet.getX(); int z = packet.getZ(); + //#endif //#else //$$ if (p instanceof S21PacketChunkData && ((S21PacketChunkData) p).getExtractedSize() == 0) { //$$ S21PacketChunkData packet = (S21PacketChunkData) p; diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 4cd9b9e6..0360b4a2 100644 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -817,7 +817,11 @@ public class ReplayHandler { //#endif //#if MC>=12106 //$$ GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer; + //#if MC >= 26.1 + //$$ GuiRenderState guiRenderState = gameRenderer.getGameRenderState().guiRenderState; + //#else //$$ GuiRenderState guiRenderState = gameRenderer.getGuiState(); + //#endif //$$ guiRenderState.clear(); //#if MC>=12111 //$$ int mouseX = (int) mc.mouse.getX() * window.getScaledWidth() / Math.max(window.getWidth(), 1); @@ -859,7 +863,9 @@ public class ReplayHandler { //#endif popMatrix(); - //#if MC>=12102 + //#if MC >= 26.1 + //$$ RenderSystem.flipFrame(null); + //#elseif MC>=12102 //$$ mc.getWindow().swapBuffers(null); //#elseif MC>=11500 mc.getWindow().swapBuffers(); diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index e6d5acac..21a656c8 100644 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -181,6 +181,9 @@ public class CameraEntity //#endif , false //#endif + //#if MC >= 26.1 + //$$ , mcIn.computeChatAbilities() + //#endif ); //#if MC>=10900 setUuid(CAMERA_UUID); diff --git a/src/main/java/com/replaymod/replay/handler/GuiHandler.java b/src/main/java/com/replaymod/replay/handler/GuiHandler.java index 26192771..290da81f 100644 --- a/src/main/java/com/replaymod/replay/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/replay/handler/GuiHandler.java @@ -588,7 +588,7 @@ public class GuiHandler extends EventRegistrations { : EMPTY //#endif //#if MC>=11903 - //$$ , DEFAULT_NARRATION_SUPPLIER + //$$ , ButtonWidget.DEFAULT_NARRATION_SUPPLIER //#endif ); this.guiScreen = guiScreen; diff --git a/src/main/java/com/replaymod/replay/mixin/MixinRenderLivingBase.java b/src/main/java/com/replaymod/replay/mixin/MixinRenderLivingBase.java index 5326467f..dd4f5fc1 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinRenderLivingBase.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinRenderLivingBase.java @@ -24,7 +24,7 @@ import static com.replaymod.core.versions.MCVer.*; //#endif public abstract class MixinRenderLivingBase { //#if FABRIC>=1 - @Inject(method = "hasLabel", at = @At("HEAD"), cancellable = true) + @Inject(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;)Z", at = @At("HEAD"), cancellable = true) //#else //$$ @Inject(method = "canRenderName(Lnet/minecraft/entity/LivingEntity;)Z", at = @At("HEAD"), cancellable = true) //#endif @@ -45,7 +45,7 @@ public abstract class MixinRenderLivingBase { //#if MC>=12102 //$$ method = "updateRenderState(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/client/render/entity/state/LivingEntityRenderState;F)V", //#elseif MC>=11500 - method = "render", + method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", //#else //$$ method = "render(Lnet/minecraft/entity/LivingEntity;FFFFFF)V", //#endif diff --git a/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java b/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java index 20d75a52..20522f5c 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java @@ -23,7 +23,7 @@ public class MixinTileEntityEndPortalRenderer { static //#else //#if MC>=11400 - //$$ @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;getMeasuringTimeMs()J")) + //$$ @Redirect(method = "render(Lnet/minecraft/block/entity/EndPortalBlockEntity;DDDFI)V", 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")) diff --git a/src/main/java/com/replaymod/replay/mixin/Mixin_MoveRealmsButton.java b/src/main/java/com/replaymod/replay/mixin/Mixin_MoveRealmsButton.java index 2ccc1c9b..9441bfc3 100644 --- a/src/main/java/com/replaymod/replay/mixin/Mixin_MoveRealmsButton.java +++ b/src/main/java/com/replaymod/replay/mixin/Mixin_MoveRealmsButton.java @@ -11,13 +11,23 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(TitleScreen.class) public abstract class Mixin_MoveRealmsButton { - //#if MC>=11901 + //#if MC >= 26.1 + //$$ private static final String REALMS_INIT = "Lcom/mojang/realmsclient/gui/screens/RealmsNotificationsScreen;init(II)V"; + //#elseif MC>=11901 //$$ private static final String REALMS_INIT = "Lnet/minecraft/client/realms/gui/screen/RealmsNotificationsScreen;init(Lnet/minecraft/client/MinecraftClient;II)V"; //#else private static final String REALMS_INIT = "Lnet/minecraft/client/gui/screen/Screen;init(Lnet/minecraft/client/MinecraftClient;II)V"; //#endif - @ModifyArg(method = "init", at = @At(value = "INVOKE", target = REALMS_INIT), index = 2) + @ModifyArg( + method = "init", + at = @At(value = "INVOKE", target = REALMS_INIT), + //#if MC >= 26.1 + //$$ index = 1 + //#else + index = 2 + //#endif + ) private int adjustRealmsButton(int height) { String setting = ReplayMod.instance.getSettingsRegistry().get(Setting.MAIN_MENU_BUTTON); if (MainMenuButtonPosition.valueOf(setting) == MainMenuButtonPosition.BIG) { diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java index 53d8bf04..92938522 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java @@ -354,9 +354,9 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline line : state.lines) { //#if MC>=12111 - //$$ emitLine(matrixStack, vertexConsumers.getBuffer(RenderLayers.LINES), line.getLeft(), line.getRight(), state.color, state.lineWidth); + //$$ emitLine(matrixStack, this.vertexConsumers.getBuffer(RenderLayers.LINES), line.getLeft(), line.getRight(), state.color, state.lineWidth); //#else - //$$ emitLine(matrixStack, vertexConsumers.getBuffer(RenderLayer.LINES), line.getLeft(), line.getRight(), state.color, state.lineWidth); + //$$ emitLine(matrixStack, this.vertexConsumers.getBuffer(RenderLayer.LINES), line.getLeft(), line.getRight(), state.color, state.lineWidth); //#endif //$$ } //$$ } diff --git a/src/main/resources/mixins.core.replaymod.json b/src/main/resources/mixins.core.replaymod.json index eb682f0d..3d3580d7 100644 --- a/src/main/resources/mixins.core.replaymod.json +++ b/src/main/resources/mixins.core.replaymod.json @@ -4,6 +4,9 @@ "mixins": [], "server": [], "client": [ + //#if MC >= 26.1 + //$$ "BlockableEventLoopAccessor", + //#endif "Mixin_ContextualKeyBindings", //#if MC>=11400 "AbstractButtonWidgetAccessor", diff --git a/version.txt b/version.txt index 74d0c76f..e760bfcb 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.6.25 +2.6.26 diff --git a/versions/1.14.4-forge/.gitkeep b/versions/1.14.4-forge/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.20.2/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java b/versions/1.20.2/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java index a278a9e4..ac6a861b 100644 --- a/versions/1.20.2/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java +++ b/versions/1.20.2/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java @@ -8,13 +8,9 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Camera; import net.minecraft.client.render.ChunkRenderingDataPreparer; import net.minecraft.client.render.Frustum; -import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.render.chunk.ChunkBuilder; import net.minecraft.client.render.chunk.ChunkRendererRegionBuilder; -import net.minecraft.client.util.math.MatrixStack; -import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -27,6 +23,11 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +//#if MC >= 26.1 +//$$ import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +//$$ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +//#endif + @Mixin(WorldRenderer.class) public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { private ForceChunkLoadingHook replayModRender_hook; @@ -46,7 +47,8 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { @Shadow @Final private ChunkRenderingDataPreparer field_45615; - //#if MC>=12109 + //#if MC >= 26.1 + //#elseif MC>=12109 //$$ @Shadow protected abstract void method_74752(Camera par1, Frustum par2, boolean par3); //#else @Shadow protected abstract void setupTerrain(Camera par1, Frustum par2, boolean par3, boolean par4); @@ -60,6 +62,10 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { @Shadow protected abstract void applyFrustum(Frustum par1); + //#if MC >= 26.1 + //$$ @WrapMethod(method = "update") + //$$ private void forceAllChunks(Camera camera, Operation original) { + //#else @Inject(method = "render", at = @At(value = "INVOKE", target = SETUP_TERRAIN)) private void forceAllChunks( CallbackInfo ci, @@ -68,10 +74,11 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { //#endif @Local(argsOnly = true) Camera camera ) { - if (replayModRender_hook == null) { - return; - } - if (FlawlessFrames.hasSodium()) { + //#endif + if (replayModRender_hook == null || FlawlessFrames.hasSodium()) { + //#if MC >= 26.1 + //$$ original.call(camera); + //#endif return; } @@ -85,7 +92,9 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { boolean areWeDoneYet = true; // Determine which chunks shall be visible - //#if MC>=12109 + //#if MC >= 26.1 + //$$ original.call(camera); + //#elseif MC>=12109 //$$ method_74752(camera, frustum, this.client.player.isSpectator()); //#else setupTerrain(camera, this.frustum, this.capturedFrustum != null, this.client.player.isSpectator()); @@ -106,11 +115,13 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { } } + //#if MC < 26.1 // If that async processing did change the chunk graph, we need to re-apply the frustum (otherwise this is // only done in the next setupTerrain call, which not happen this frame) if (renderingData.method_52836()) { this.applyFrustum((new Frustum(frustum)).coverBoxAroundSetPosition(8)); // call based on the one in setupTerrain } + //#endif // 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) diff --git a/versions/1.20.4/.gitkeep b/versions/1.20.4/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.21.10/src/main/java/com/replaymod/render/mixin/MixinRenderManager.java b/versions/1.21.10/src/main/java/com/replaymod/render/mixin/MixinRenderManager.java index d23609d7..a85941c2 100644 --- a/versions/1.21.10/src/main/java/com/replaymod/render/mixin/MixinRenderManager.java +++ b/versions/1.21.10/src/main/java/com/replaymod/render/mixin/MixinRenderManager.java @@ -31,8 +31,23 @@ public abstract class MixinRenderManager { copy.blockPos = org.blockPos; copy.pos = org.pos; copy.initialized = org.initialized; + //#if MC < 26.1 copy.entityPos = org.entityPos; + //#endif copy.orientation.lookAlong((float) dx, (float) dy, (float) dz, 0f, 1f, 0f); + //#if MC >= 26.1 + //$$ copy.xRot = org.xRot; + //$$ copy.yRot = org.yRot; + //$$ copy.isPanoramicMode = org.isPanoramicMode; + //$$ copy.cullFrustum.set(org.cullFrustum); + //$$ copy.fogType = org.fogType; + //$$ copy.fogData = org.fogData; + //$$ copy.hudFov = org.hudFov; + //$$ copy.depthFar = org.depthFar; + //$$ copy.projectionMatrix.set(org.projectionMatrix); + //$$ copy.viewRotationMatrix.set(org.viewRotationMatrix); + //$$ copy.entityRenderState = org.entityRenderState; + //#endif cameraRenderStateRef.set(copy); } } diff --git a/versions/1.21.2/.gitkeep b/versions/1.21.2/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_FixCopyTextureToBuffer_DepthTexture.java b/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_FixCopyTextureToBuffer_DepthTexture.java index 02e70ff3..7b988c4f 100644 --- a/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_FixCopyTextureToBuffer_DepthTexture.java +++ b/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_FixCopyTextureToBuffer_DepthTexture.java @@ -5,11 +5,14 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.textures.GpuTexture; import net.minecraft.client.gl.FramebufferManager; -import net.minecraft.client.gl.GlResourceManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(GlResourceManager.class) +//#if MC >= 26.1 +//$$ @Mixin(targets = "com.mojang.blaze3d.opengl.GlCommandEncoder") +//#else +@Mixin(net.minecraft.client.gl.GlResourceManager.class) +//#endif public class Mixin_FixCopyTextureToBuffer_DepthTexture { @WrapOperation( //#if MC>=12111 diff --git a/versions/26.1/.gitkeep b/versions/26.1/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/26.1/src/main/java/com/replaymod/core/mixin/BlockableEventLoopAccessor.java b/versions/26.1/src/main/java/com/replaymod/core/mixin/BlockableEventLoopAccessor.java new file mode 100644 index 00000000..5770f812 --- /dev/null +++ b/versions/26.1/src/main/java/com/replaymod/core/mixin/BlockableEventLoopAccessor.java @@ -0,0 +1,14 @@ +package com.replaymod.core.mixin; + +import net.minecraft.CrashReport; +import net.minecraft.util.thread.BlockableEventLoop; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.function.Supplier; + +@Mixin(BlockableEventLoop.class) +public interface BlockableEventLoopAccessor { + @Accessor + Supplier getDelayedCrash(); +} diff --git a/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_BlockOnChunkRebuilds.java b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_BlockOnChunkRebuilds.java new file mode 100644 index 00000000..686b5c88 --- /dev/null +++ b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_BlockOnChunkRebuilds.java @@ -0,0 +1,121 @@ +package com.replaymod.render.mixin; + +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.replaymod.render.hooks.ForceChunkLoadingHook; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.renderer.chunk.SectionRenderDispatcher; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +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.Map; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +@Mixin(SectionRenderDispatcher.class) +public abstract class Mixin_BlockOnChunkRebuilds implements ForceChunkLoadingHook.IBlockOnChunkRebuilds { + @Unique + private final ReentrantLock newMainThreadWorkLock = new ReentrantLock(); + @Unique + private final Condition newMainThreadWork = newMainThreadWorkLock.newCondition(); + + @Unique + private long scheduledTasks = 0; + @Unique + private long doneTasks = 0; + + @Inject(method = "schedule", at = @At(value = "INVOKE", target = "Lnet/minecraft/TracingExecutor;execute(Ljava/lang/Runnable;)V")) + private void incrementScheduledTasks(CallbackInfo ci) { + newMainThreadWorkLock.lock(); + try { + scheduledTasks++; + } finally { + newMainThreadWorkLock.unlock(); + } + } + + @WrapMethod(method = "runTask") + private void incrementDoneTasks(Operation original) { + try { + original.call(); + } finally { + newMainThreadWorkLock.lock(); + try { + doneTasks++; + newMainThreadWork.signalAll(); + } finally { + newMainThreadWorkLock.unlock(); + } + } + } + + @Unique + private long prevTotalDoneTasks; + + @Override + public boolean uploadEverythingBlocking() { + while (true) { + long doneTasksAtStartOfLoop; + boolean allTasksDone; + newMainThreadWorkLock.lock(); + try { + doneTasksAtStartOfLoop = doneTasks; + allTasksDone = scheduledTasks == doneTasks; + } finally { + newMainThreadWorkLock.unlock(); + } + + // Upload any buffers that may still be pending + uploadAllStagedAllocations(); + + // If there were no tasks still running, everything should be uploaded now. + if (allTasksDone) { + break; + } + + // Otherwise we need to wait for more work to come in + newMainThreadWorkLock.lock(); + try { + while (doneTasksAtStartOfLoop == doneTasks) { + newMainThreadWork.awaitUninterruptibly(); + } + } finally { + newMainThreadWorkLock.unlock(); + } + } + + boolean doneAnything = doneTasks != prevTotalDoneTasks; + prevTotalDoneTasks = doneTasks; + return doneAnything; + } + + @Unique + private void uploadAllStagedAllocations() { + copyLock.lock(); + try { + // MC will only allow one buffer resize per frame (presumably to avoid lag spikes), so we'll simply call + // the method as often as there are buffers (there's only a fixed amount of 3, one per ChunkSectionLayer) + for (int i = 0; i < chunkUberBuffers.size(); i++) { + uploadGlobalGeomBuffersToGPU(); + } + } finally { + copyLock.unlock(); + } + } + + @Shadow + @Final + private ReentrantLock copyLock; + + @Shadow + public abstract void uploadGlobalGeomBuffersToGPU(); + + @Shadow + @Final + private Map chunkUberBuffers; +} diff --git a/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags_PlayerEntity.java b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags_PlayerEntity.java new file mode 100644 index 00000000..67ec2594 --- /dev/null +++ b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_HideNameTags_PlayerEntity.java @@ -0,0 +1,14 @@ +package com.replaymod.render.mixin; + +import com.replaymod.core.versions.MCVer; +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.renderer.entity.player.AvatarRenderer; +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(AvatarRenderer.class) +public abstract class Mixin_HideNameTags_PlayerEntity { + // 1.21.11 and below +} diff --git a/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java new file mode 100644 index 00000000..52d2cb33 --- /dev/null +++ b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Camera.java @@ -0,0 +1,10 @@ +package com.replaymod.render.mixin; + +import net.minecraft.client.renderer.GameRenderer; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(GameRenderer.class) +public abstract class Mixin_Omnidirectional_Camera { + // Now handled by Camera.enablePanoramicMode + // 1.21.11 and below +} diff --git a/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Rotation.java b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Rotation.java new file mode 100644 index 00000000..ca83639f --- /dev/null +++ b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_Omnidirectional_Rotation.java @@ -0,0 +1,99 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.capturer.CubicOpenGlFrameCapturer; +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.Camera; +import org.joml.Quaternionf; +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +//#if MC>=12005 +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import org.joml.Matrix4f; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#endif + +//#if MC>=11500 +//#else +//$$ import org.lwjgl.opengl.GL11; +//#endif + +import static com.replaymod.core.versions.MCVer.getMinecraft; +import static org.joml.Math.PI_OVER_2_f; +import static org.joml.Math.PI_f; + +@Mixin(Camera.class) +public abstract class Mixin_Omnidirectional_Rotation { + @Shadow + @Final + private static Vector3f FORWARDS; + + @Shadow + @Final + private static Vector3f UP; + + @Shadow + @Final + private static Vector3f LEFT; + + @Shadow + @Final + private Quaternionf rotation; + + @Shadow + @Final + private Vector3f forwards; + + @Shadow + @Final + private Vector3f up; + + @Shadow + @Final + private Vector3f left; + + @Shadow + private int matrixPropertiesDirty; + + @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;alignWithEntity(F)V", shift = At.Shift.AFTER)) + private void replayModRender_setupCubicFrameRotation(CallbackInfo ci) { + if (getHandler() == null || !(getHandler().data instanceof CubicOpenGlFrameCapturer.Data)) return; + CubicOpenGlFrameCapturer.Data data = (CubicOpenGlFrameCapturer.Data) getHandler().data; + + switch (data) { + case FRONT: + break; + case RIGHT: + this.rotation.rotateY(-PI_OVER_2_f); + break; + case BACK: + this.rotation.rotateY(PI_f); + break; + case LEFT: + this.rotation.rotateY(PI_OVER_2_f); + break; + case TOP: + this.rotation.rotateX(PI_OVER_2_f); + break; + case BOTTOM: + this.rotation.rotateX(-PI_OVER_2_f); + break; + } + + // From setRotation + FORWARDS.rotate(this.rotation, this.forwards); + UP.rotate(this.rotation, this.up); + LEFT.rotate(this.rotation, this.left); + this.matrixPropertiesDirty |= 3; + } + + @Unique + private EntityRendererHandler getHandler() { + return ((EntityRendererHandler.IEntityRenderer) getMinecraft().gameRenderer).replayModRender_getHandler(); + } +} diff --git a/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_StabilizeCamera.java b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_StabilizeCamera.java new file mode 100644 index 00000000..65fbfa20 --- /dev/null +++ b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_StabilizeCamera.java @@ -0,0 +1,50 @@ +package com.replaymod.render.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.replaymod.render.RenderSettings; +import com.replaymod.render.hooks.EntityRendererHandler; +import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +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.Camera; +//#else +//$$ import net.minecraft.client.renderer.EntityRenderer; +//#endif + +@Mixin(value = Camera.class) +public abstract class Mixin_StabilizeCamera { + @WrapOperation(method = "alignWithEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;setRotation(FF)V")) + private void replayModRender_stabilizeCamera(Camera instance, float yRot, float xRot, Operation original) { + if (getHandler() != null) { + RenderSettings settings = getHandler().getSettings(); + + if (settings.isStabilizeYaw()) { + yRot = 0f; + } + + if (settings.isStabilizePitch()) { + xRot = 0f; + } + + // Roll handled in MixinCamera + } + + original.call(instance, yRot, xRot); + } + + @Unique + private EntityRendererHandler getHandler() { + return ((EntityRendererHandler.IEntityRenderer) getMinecraft().gameRenderer).replayModRender_getHandler(); + } +} diff --git a/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java new file mode 100644 index 00000000..a75b6dc9 --- /dev/null +++ b/versions/26.1/src/main/java/com/replaymod/render/mixin/Mixin_Stereoscopic_Camera.java @@ -0,0 +1,32 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.Camera; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +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.getMinecraft; + +@Mixin(Camera.class) +public abstract class Mixin_Stereoscopic_Camera { + @Shadow + protected abstract void move(float forwards, float up, float right); + + @Inject(method = "alignWithEntity", at = @At("RETURN")) + private void replayModRender_setupStereoscopicProjection(CallbackInfo ci) { + if (getHandler() == null || !(getHandler().data instanceof StereoscopicOpenGlFrameCapturer.Data)) return; + StereoscopicOpenGlFrameCapturer.Data data = (StereoscopicOpenGlFrameCapturer.Data) getHandler().data; + + move(0f, 0f, 0.1f * (data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? -1 : 1)); + } + + @Unique + private EntityRendererHandler getHandler() { + return ((EntityRendererHandler.IEntityRenderer) getMinecraft().gameRenderer).replayModRender_getHandler(); + } +} diff --git a/versions/26.1/src/main/java/com/replaymod/replay/mixin/MixinCamera.java b/versions/26.1/src/main/java/com/replaymod/replay/mixin/MixinCamera.java new file mode 100644 index 00000000..b0027e72 --- /dev/null +++ b/versions/26.1/src/main/java/com/replaymod/replay/mixin/MixinCamera.java @@ -0,0 +1,30 @@ +package com.replaymod.replay.mixin; + +import com.replaymod.render.hooks.EntityRendererHandler; +import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.Camera; +import net.minecraft.world.entity.Entity; +import org.jspecify.annotations.Nullable; +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.ModifyArg; + +import static com.replaymod.core.versions.MCVer.getMinecraft; + +@Mixin(Camera.class) +public class MixinCamera { + @Shadow + private @Nullable Entity entity; + + @ModifyArg(method = "setRotation", at = @At(value = "INVOKE", target = "Lorg/joml/Quaternionf;rotationYXZ(FFF)Lorg/joml/Quaternionf;"), index = 2) + private float applyRoll(float rotZ) { + Entity entity = this.entity; + if (!(entity instanceof CameraEntity)) return rotZ; + + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) getMinecraft().gameRenderer).replayModRender_getHandler(); + if (handler != null && handler.getSettings().isStabilizeRoll()) return rotZ; + + return rotZ - ((CameraEntity) entity).roll * (float) Math.PI / 180f; + } +} diff --git a/versions/26.1/src/main/resources/fabric.mod.json b/versions/26.1/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..170595ec --- /dev/null +++ b/versions/26.1/src/main/resources/fabric.mod.json @@ -0,0 +1,57 @@ +{ + "schemaVersion": 1, + "id": "replaymod", + "version": "${version}", + + "name": "Replay Mod", + "description": "A Mod which allows you to record, replay and share your Minecraft experience.", + "authors": [ + "CrushedPixel", + "johni0702" + ], + "contact": { + "homepage": "https://replaymod.com/", + "sources": "https://github.com/ReplayMod/ReplayMod" + }, + + "license": "GPL-3.0-or-later", + "icon": "assets/replaymod/favicon_logo.png", + + "environment": "client", + "entrypoints": { + "client": [ + "com.replaymod.core.ReplayModBackend" + ], + "modmenu": [ + "com.replaymod.core.gui.ModMenuApiImpl" + ], + "frex_flawless_frames": [ + "com.replaymod.render.utils.FlawlessFrames::registerConsumer" + ], + "preLaunch": [ + "com.replaymod.core.DummyChainLoadEntryPoint", + "com.replaymod.core.MixinExtrasInit" + ], + "mm:early_risers": [ + "com.replaymod.core.ReplayModMMLauncher" + ] + }, + "mixins": [ + "mixins.jgui.json", + "mixins.nonmmlauncher.replaymod.json" + ], + + "depends": { + "fabricloader": ">=0.18.5", + "fabric-networking-api-v1": "*", + "fabric-key-mapping-api-v1": "*", + "fabric-resource-loader-v0": "*" + }, + + "custom": { + "mm:early_risers": [ + "com.replaymod.core.ReplayModMMLauncher" + ], + "modmenu:clientsideOnly": true + } +} diff --git a/versions/mapping-fabric-26.1-1.21.11.txt b/versions/mapping-fabric-26.1-1.21.11.txt new file mode 100644 index 00000000..0c8eab22 --- /dev/null +++ b/versions/mapping-fabric-26.1-1.21.11.txt @@ -0,0 +1,32 @@ +net.minecraft.client.Minecraft delayCrash() setCrashReportSupplier() +net.minecraft.client.gui.components.ChatComponent addClientSystemMessage() addMessage() +net.minecraft.client.renderer.state.gui.GuiRenderState reset() clear() +net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState net.minecraft.client.gui.render.state.special.SpecialGuiElementRenderState +net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState x0() x1() +net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState x1() x2() +net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState y0() y1() +net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState y1() y2() +net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState scissorArea() comp_4128() +net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState scale() comp_4133() +net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState getBounds() createBounds() +net.minecraft.client.renderer.state.level.QuadParticleRenderState net.minecraft.client.particle.BillboardParticleSubmittable +com.mojang.blaze3d.platform.WindowEventHandler resizeGui() onResolutionChanged() +net.minecraft.client.renderer.LevelRenderer lambda$addSkyPass$0() method_62215() +net.minecraft.client.renderer.state.gui.GuiRenderState net.minecraft.client.gui.render.state.GuiRenderState +net.minecraft.client.renderer.state.level.CameraRenderState net.minecraft.client.render.state.CameraRenderState +net.minecraft.client.gui.Gui extractRenderState() render() +net.minecraft.client.gui.Gui extractItemHotbar() renderHotbar() +net.minecraft.client.gui.GuiGraphicsExtractor net.minecraft.client.gui.DrawContext +net.minecraft.client.gui.GuiGraphicsExtractor guiRenderState state +net.minecraft.client.gui.components.AbstractButton extractContents() drawIcon() +net.minecraft.client.gui.components.Renderable extractRenderState() render() +net.minecraft.client.gui.screens.Screen extractRenderStateWithTooltipAndSubtitles() renderWithTooltip() + +net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry +net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry clientboundPlay()Lnet/fabricmc/fabric/api/networking/v1/PayloadTypeRegistry; playS2C() +net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry clientboundConfiguration()Lnet/fabricmc/fabric/api/networking/v1/PayloadTypeRegistry; configurationS2C() +net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper +net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper registerKeyMapping() registerKeyBinding(Lnet/minecraft/client/option/KeyBinding;)Lnet/minecraft/client/option/KeyBinding; +net.fabricmc.fabric.api.client.screen.v1.Screens net.fabricmc.fabric.api.client.screen.v1.Screens +net.fabricmc.fabric.api.client.screen.v1.Screens getWidgets() getButtons(Lnet/minecraft/client/gui/screen/Screen;)Ljava/util/List; +