Update to 26.1

This commit is contained in:
Jonas Herzig
2026-03-29 11:20:59 +02:00
parent b72fad4055
commit 27d5432fff
40 changed files with 667 additions and 58 deletions

View File

@@ -1,5 +1,6 @@
import com.replaymod.gradle.preprocess.PreprocessTask import com.replaymod.gradle.preprocess.PreprocessTask
import gg.essential.gradle.util.* import gg.essential.gradle.util.*
import net.fabricmc.loom.task.RemapJarTask
plugins { plugins {
java java
@@ -22,11 +23,14 @@ base.archivesName.set("replaymod")
java.withSourcesJar() java.withSourcesJar()
loom { loom {
mixin.useLegacyMixinAp = true
mixin.defaultRefmapName.set("mixins.replaymod.refmap.json")
noServerRunConfigs() noServerRunConfigs()
} }
if (!platform.isUnobfuscated) {
loom.mixin.useLegacyMixinAp = true
loom.mixin.defaultRefmapName.set("mixins.replaymod.refmap.json")
}
if (platform.isLegacyForge) { if (platform.isLegacyForge) {
loom.runs.named("client") { loom.runs.named("client") {
property("fml.coreMods.load", "com.replaymod.core.LoadingPlugin") property("fml.coreMods.load", "com.replaymod.core.LoadingPlugin")
@@ -94,6 +98,7 @@ dependencies {
12107 -> "0.128.1+1.21.7" 12107 -> "0.128.1+1.21.7"
12110 -> "0.135.0+1.21.10" 12110 -> "0.135.0+1.21.10"
12111 -> "0.139.5+1.21.11" 12111 -> "0.139.5+1.21.11"
26_01_00 -> "0.144.3+26.1"
else -> throw UnsupportedOperationException() else -> throw UnsupportedOperationException()
} }
val fabricApiModules = mutableListOf( val fabricApiModules = mutableListOf(
@@ -116,6 +121,10 @@ dependencies {
if (mcVersion >= 12109) { if (mcVersion >= 12109) {
fabricApiModules.add("resource-loader-v1") 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) { for (module in fabricApiModules) {
val dep = fabricApi.module("fabric-$module", fabricApiVersion) val dep = fabricApi.module("fabric-$module", fabricApiVersion)
modImplementation(dep) modImplementation(dep)
@@ -170,11 +179,12 @@ dependencies {
// FIXME hack because I don't know how to get this to be inherited properly // 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(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")!!) implementation(shadow("com.github.ReplayMod:lwjgl-utils:27dcd66")!!)
if (platform.isFabric) { if (platform.isFabric) {
val modMenuVersion = when { val modMenuVersion = when {
mcVersion >= 26_01_00 -> "18.0.0-alpha.8"
mcVersion >= 12111 -> "17.0.0-alpha.1" mcVersion >= 12111 -> "17.0.0-alpha.1"
mcVersion >= 12110 -> "16.0.0-rc.1" mcVersion >= 12110 -> "16.0.0-rc.1"
mcVersion >= 12107 -> "15.0.0-beta.3" mcVersion >= 12107 -> "15.0.0-beta.3"
@@ -211,6 +221,7 @@ dependencies {
} }
val irisVersion = when { val irisVersion = when {
mcVersion >= 26_01_00 -> "1.10.8+26.1-fabric"
mcVersion >= 12000 -> "1.7.2+1.20.1" mcVersion >= 12000 -> "1.7.2+1.20.1"
mcVersion >= 11600 -> "1.18.x-v1.2.0" mcVersion >= 11600 -> "1.18.x-v1.2.0"
else -> null else -> null
@@ -252,11 +263,13 @@ tasks.jar {
} }
} }
tasks.remapJar { if (!platform.isUnobfuscated) {
tasks.named<RemapJarTask>("remapJar") {
if (platform.isFabric) { if (platform.isFabric) {
addNestedDependencies.set(true) addNestedDependencies.set(true)
} }
archiveClassifier.set("obf") archiveClassifier.set("obf")
}
} }
val configureRelocationOutput = project.layout.buildDirectory.file("configureRelocation") val configureRelocationOutput = project.layout.buildDirectory.file("configureRelocation")
@@ -319,9 +332,9 @@ val configureRelocation by tasks.registering {
} }
val bundleJar by tasks.registering(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) { val bundleJar by tasks.registering(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) {
from((if (platform.isUnobfuscated) tasks.jar else tasks.remapJar).flatMap { it.archiveFile }.map { zipTree(it) }) from((if (platform.isUnobfuscated) tasks.jar else tasks.named<RemapJarTask>("remapJar")).flatMap { it.archiveFile }.map { zipTree(it) })
from((if (platform.isUnobfuscated) jGui.tasks.jar else jGui.tasks.remapJar).flatMap { it.archiveFile }.map { zipTree(it) }) { from((if (platform.isUnobfuscated) jGui.tasks.jar else jGui.tasks.named<RemapJarTask>("remapJar")).flatMap { it.archiveFile }.map { zipTree(it) }) {
filesMatching("mixins.jgui.json") { filesMatching("mixins.jgui.json") {
filter { it.replace("de.johni0702", "com.replaymod.lib.de.johni0702") } filter { it.replace("de.johni0702", "com.replaymod.lib.de.johni0702") }
} }

View File

@@ -1,5 +1,5 @@
essential.defaults.loom=0 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. # 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. # This is required to provide enough memory for the Minecraft decompilation process.

2
jGui

Submodule jGui updated: 68de9e2d2a...b0e068383c

View File

@@ -6,6 +6,7 @@ import org.gradle.process.ExecOperations
plugins { plugins {
id("gg.essential.multi-version.root") id("gg.essential.multi-version.root")
id("gg.essential.loom") version "1.15.48" 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" id("com.github.hierynomus.license") version "0.15.0"
} }
@@ -49,8 +50,9 @@ subprojects {
if (name == "jGui" || name == "ReplayStudio") { if (name == "jGui" || name == "ReplayStudio") {
return@subprojects return@subprojects
} }
val (_, minor) = name.split("-")[0].split(".") val (major, minor, patch) = name.split("-")[0].split(".") + listOf("0")
val fabric = minor.toInt() >= 14 && !name.endsWith("-forge") 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") extra.set("loom.platform", if (fabric) "fabric" else "forge")
afterEvaluate { afterEvaluate {
@@ -213,6 +215,7 @@ defaultTasks("bundleJar")
preprocess { preprocess {
strictExtraMappings.set(true) strictExtraMappings.set(true)
val mc26_01_00 = createNode("26.1", 26_01_00, "yarn")
val mc12111 = createNode("1.21.11", 12111, "yarn") val mc12111 = createNode("1.21.11", 12111, "yarn")
val mc12110 = createNode("1.21.10", 12110, "yarn") val mc12110 = createNode("1.21.10", 12110, "yarn")
val mc12107 = createNode("1.21.7", 12107, "yarn") val mc12107 = createNode("1.21.7", 12107, "yarn")
@@ -248,6 +251,7 @@ preprocess {
val mc10800 = createNode("1.8", 10800, "srg") val mc10800 = createNode("1.8", 10800, "srg")
val mc10710 = createNode("1.7.10", 10710, "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")) 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")) mc12110.link(mc12107, file("versions/mapping-fabric-1.21.10-1.21.7.txt"))
mc12107.link(mc12105) mc12107.link(mc12105)

View File

@@ -46,6 +46,7 @@ val jGuiVersions = listOf(
"1.21.7", "1.21.7",
"1.21.10", "1.21.10",
"1.21.11", "1.21.11",
"26.1",
) )
val replayModVersions = listOf( val replayModVersions = listOf(
// "1.7.10", // "1.7.10",
@@ -82,6 +83,7 @@ val replayModVersions = listOf(
"1.21.7", "1.21.7",
"1.21.10", "1.21.10",
"1.21.11", "1.21.11",
"26.1",
) )
rootProject.buildFileName = "root.gradle.kts" rootProject.buildFileName = "root.gradle.kts"

View File

@@ -0,0 +1 @@
// 26.1+

View File

@@ -57,12 +57,16 @@ public interface MinecraftAccessor {
//$$ Queue<FutureTask<?>> getScheduledTasks(); //$$ Queue<FutureTask<?>> getScheduledTasks();
//#endif //#endif
//#if MC >= 26.1
//$$ // Now in BlockableEventLoopAccessor
//#else
@Accessor("crashReport") @Accessor("crashReport")
//#if MC>=11800 //#if MC>=11800
//$$ Supplier<CrashReport> getCrashReporter(); //$$ Supplier<CrashReport> getCrashReporter();
//#else //#else
CrashReport getCrashReporter(); CrashReport getCrashReporter();
//#endif //#endif
//#endif
//#if MC<11400 //#if MC<11400
//$$ @Accessor //$$ @Accessor

View File

@@ -34,10 +34,6 @@ public abstract class MixinMinecraft
extends ReentrantThreadExecutor<Runnable> extends ReentrantThreadExecutor<Runnable>
//#endif //#endif
implements MCVer.MinecraftMethodAccessor { implements MCVer.MinecraftMethodAccessor {
//#if MC>=11400
public MixinMinecraft(String string_1) { super(string_1); }
//#endif
//#if MC>=11400 //#if MC>=11400
@Shadow protected abstract void handleInputEvents(); @Shadow protected abstract void handleInputEvents();
@@ -59,7 +55,9 @@ public abstract class MixinMinecraft
} }
//#endif //#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"; //$$ private static final String GAME_RENDERER_RENDER = "Lnet/minecraft/client/render/GameRenderer;render(Lnet/minecraft/client/render/RenderTickCounter;Z)V";
//#else //#else
private static final String GAME_RENDERER_RENDER = "Lnet/minecraft/client/render/GameRenderer;render(FJZ)V"; 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; //$$ return wheel;
//$$ } //$$ }
//#endif //#endif
//#if MC >= 26.1
//$$ MixinMinecraft() { super(null, false); }
//#elseif MC>=11400
MixinMinecraft() { super(null); }
//#endif
} }

View File

@@ -20,10 +20,11 @@ public class Mixin_PostRenderWorldCalback {
//$$ private void postRenderWorld(CallbackInfo ci) { //$$ private void postRenderWorld(CallbackInfo ci) {
//$$ MatrixStack matrixStack = new MatrixStack(); //$$ MatrixStack matrixStack = new MatrixStack();
//#else //#else
@Inject(method = "render", at = @At("RETURN"))
//#if MC>=11500 //#if MC>=11500
@Inject(method = "render", at = @At("RETURN"))
private void postRenderWorld(CallbackInfo ci, @Local(argsOnly = true) MatrixStack matrixStack) { private void postRenderWorld(CallbackInfo ci, @Local(argsOnly = true) MatrixStack matrixStack) {
//#else //#else
//$$ @Inject(method = "render", at = @At("RETURN"))
//$$ private void postRenderWorld(CallbackInfo ci) { //$$ private void postRenderWorld(CallbackInfo ci) {
//$$ MatrixStack matrixStack = new MatrixStack(); //$$ MatrixStack matrixStack = new MatrixStack();
//#endif //#endif

View File

@@ -630,13 +630,24 @@ class Patterns {
@Pattern @Pattern
private static CrashException crashReportToException(MinecraftClient mc) { 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()); //$$ return new CrashException(((MinecraftAccessor) mc).getCrashReporter().get());
//#else //#else
return new CrashException(((MinecraftAccessor) mc).getCrashReporter()); return new CrashException(((MinecraftAccessor) mc).getCrashReporter());
//#endif //#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 @Pattern
private static Vec3d getTrackedPosition(Entity entity) { private static Vec3d getTrackedPosition(Entity entity) {
//#if MC>=11604 //#if MC>=11604
@@ -936,10 +947,7 @@ class Patterns {
//#endif //#endif
} }
//#if MC>=10904 //#if MC>=10904 && MC<12006
//#if MC>=12006
//$$ @Pattern public void getPacketId() {}
//#else
@Pattern @Pattern
public Integer getPacketId(NetworkState state, NetworkSide side, Packet<?> packet) throws Exception { public Integer getPacketId(NetworkState state, NetworkSide side, Packet<?> packet) throws Exception {
//#if MC>=12002 //#if MC>=12002
@@ -948,8 +956,11 @@ class Patterns {
return state.getPacketId(side, packet); return state.getPacketId(side, packet);
//#endif //#endif
} }
//#else
//$$ @Pattern public void getPacketId() {}
//#endif //#endif
//#if MC>=10904 && MC < 26.1
@Pattern @Pattern
public int UnloadChunkPacket_getX(UnloadChunkS2CPacket packet) { public int UnloadChunkPacket_getX(UnloadChunkS2CPacket packet) {
//#if MC>=12002 //#if MC>=12002
@@ -968,7 +979,6 @@ class Patterns {
//#endif //#endif
} }
//#else //#else
//$$ @Pattern public void getPacketId() {}
//$$ @Pattern public void UnloadChunkPacket_getZ() {} //$$ @Pattern public void UnloadChunkPacket_getZ() {}
//$$ @Pattern public void UnloadChunkPacket_getX() {} //$$ @Pattern public void UnloadChunkPacket_getX() {}
//#endif //#endif

View File

@@ -61,7 +61,11 @@ public class SchedulerImpl implements Scheduler {
private final Thread mcThread = Thread.currentThread(); private final Thread mcThread = Thread.currentThread();
private ReplayModExecutor(String string_1) { private ReplayModExecutor(String string_1) {
//#if MC >= 26.1
//$$ super(string_1, false);
//#else
super(string_1); super(string_1);
//#endif
} }
@Override public Runnable createTask(Runnable runnable) { @Override public Runnable createTask(Runnable runnable) {

View File

@@ -27,25 +27,27 @@ public class ReplayTimer extends RenderTickCounter {
@Override @Override
// This should be handled by Remap but it isn't (was handled before a9724e3). // This should be handled by Remap but it isn't (was handled before a9724e3).
//#if MC>=11400
public public
//#if MC>=11600 //#if MC>=11600
int int
//#else //#else
//$$ void //$$ void
//#endif //#endif
//#if MC >= 26.1
//$$ advanceGameTime(
//#elseif MC >= 1.14
beginRenderTick( beginRenderTick(
//#else //#else
//$$ public void updateTimer( //$$ updateTimer(
//#endif //#endif
//#if MC>=11400 //#if MC>=11400
long sysClock long sysClock
//#endif //#endif
//#if MC>=12100 //#if MC>=12100 && MC < 26.1
//$$ , boolean tick //$$ , boolean tick
//#endif //#endif
) { ) {
//#if MC>=12100 //#if MC>=12100 && MC < 26.1
//$$ if (!tick) return 0; //$$ if (!tick) return 0;
//#endif //#endif
UpdatedCallback.EVENT.invoker().onUpdate(); UpdatedCallback.EVENT.invoker().onUpdate();

View File

@@ -185,6 +185,8 @@ public class Util {
} }
} }
//#if MC >= 26.1
//#else
public static String getTileEntityId(BlockEntity tileEntity) { public static String getTileEntityId(BlockEntity tileEntity) {
//#if MC>=12006 //#if MC>=12006
//$$ return net.minecraft.block.entity.BlockEntityType.getId(tileEntity.getType()).toString(); //$$ return net.minecraft.block.entity.BlockEntityType.getId(tileEntity.getType()).toString();
@@ -202,6 +204,7 @@ public class Util {
return nbt.getString("id"); return nbt.getString("id");
//#endif //#endif
} }
//#endif
public interface IOCallable<R> { public interface IOCallable<R> {
R call() throws IOException; R call() throws IOException;

View File

@@ -7,6 +7,10 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.gl.Framebuffer;
import net.minecraft.client.util.Window; import net.minecraft.client.util.Window;
//#if MC >= 26.1
//$$ import com.mojang.blaze3d.systems.RenderSystem;
//#endif
//#if MC>=11700 //#if MC>=11700
//$$ import net.minecraft.client.gl.WindowFramebuffer; //$$ import net.minecraft.client.gl.WindowFramebuffer;
//#endif //#endif
@@ -88,7 +92,9 @@ public class VirtualWindow implements Closeable {
guiFramebuffer.draw(framebufferWidth, framebufferHeight); guiFramebuffer.draw(framebufferWidth, framebufferHeight);
//#endif //#endif
//#if MC>=12102 //#if MC >= 26.1
//$$ RenderSystem.flipFrame(null);
//#elseif MC>=12102
//$$ window.swapBuffers(null); //$$ window.swapBuffers(null);
//#elseif MC>=11500 //#elseif MC>=11500
window.swapBuffers(); window.swapBuffers();

View File

@@ -14,7 +14,7 @@ import de.johni0702.minecraft.gui.utils.EventRegistrations;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
//#if MC>=12111 //#if MC>=12111 && MC < 26.1
//$$ import net.minecraft.client.render.CameraOverride; //$$ import net.minecraft.client.render.CameraOverride;
//$$ import org.joml.Vector3f; //$$ import org.joml.Vector3f;
//#endif //#endif
@@ -93,7 +93,8 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe
GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer; GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer;
Screen orgScreen = mc.currentScreen; Screen orgScreen = mc.currentScreen;
boolean orgPauseOnLostFocus = mc.options.pauseOnLostFocus; boolean orgPauseOnLostFocus = mc.options.pauseOnLostFocus;
//#if MC>=12106 //#if MC >= 26.1
//#elseif MC>=12106
//$$ boolean orgRenderHand = mc.gameRenderer.isRenderingPanorama(); //$$ boolean orgRenderHand = mc.gameRenderer.isRenderingPanorama();
//#else //#else
boolean orgRenderHand = gameRenderer.getRenderHand(); 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 mc.options.pauseOnLostFocus = false; // do not want the pause menu to open if the window is unfocused
if (omnidirectional) { if (omnidirectional) {
// makes no sense, we wouldn't even know where to put it // 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()))); //$$ mc.gameRenderer.setCameraOverride(new CameraOverride(new Vector3f(mc.gameRenderer.getCamera().getHorizontalPlane())));
//#elseif MC>=12106 //#elseif MC>=12106
//$$ mc.gameRenderer.setRenderingPanorama(false); //$$ mc.gameRenderer.setRenderingPanorama(false);
@@ -112,7 +115,11 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe
//#endif //#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); //$$ mc.gameRenderer.render(mc.getRenderTickCounter(), true);
//#elseif MC>=11400 //#elseif MC>=11400
mc.gameRenderer.render(partialTicks, finishTimeNano, true); mc.gameRenderer.render(partialTicks, finishTimeNano, true);
@@ -127,7 +134,9 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe
} finally { } finally {
mc.currentScreen = orgScreen; mc.currentScreen = orgScreen;
mc.options.pauseOnLostFocus = orgPauseOnLostFocus; mc.options.pauseOnLostFocus = orgPauseOnLostFocus;
//#if MC>=12111 //#if MC >= 26.1
//$$ mc.gameRenderer.getMainCamera().disablePanoramicMode();
//#elseif MC>=12111
//$$ mc.gameRenderer.setCameraOverride(null); //$$ mc.gameRenderer.setCameraOverride(null);
//#elseif MC>=12106 //#elseif MC>=12106
//$$ mc.gameRenderer.setRenderingPanorama(orgRenderHand); //$$ mc.gameRenderer.setRenderingPanorama(orgRenderHand);

View File

@@ -6,7 +6,6 @@ import org.spongepowered.asm.mixin.gen.Accessor;
//#if MC>=12106 //#if MC>=12106
//$$ import net.minecraft.client.gui.render.GuiRenderer; //$$ 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.render.fog.FogRenderer;
//$$ import net.minecraft.client.util.Pool; //$$ import net.minecraft.client.util.Pool;
//#endif //#endif
@@ -25,8 +24,13 @@ public interface GameRendererAccessor {
//$$ Pool getPool(); //$$ Pool getPool();
//$$ @Accessor //$$ @Accessor
//$$ GuiRenderer getGuiRenderer(); //$$ GuiRenderer getGuiRenderer();
//#if MC >= 26.1
//$$ @Accessor //$$ @Accessor
//$$ GuiRenderState getGuiState(); //$$ net.minecraft.client.renderer.state.GameRenderState getGameRenderState();
//#else
//$$ @Accessor
//$$ net.minecraft.client.gui.render.state.GuiRenderState getGuiState();
//#endif
//$$ @Accessor //$$ @Accessor
//$$ FogRenderer getFogRenderer(); //$$ FogRenderer getFogRenderer();
//#endif //#endif

View File

@@ -10,7 +10,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(EntityRenderer.class) @Mixin(EntityRenderer.class)
public abstract class Mixin_HideNameTags { 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) @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true)
//#else //#else
//#if MC>=11400 //#if MC>=11400

View File

@@ -40,6 +40,10 @@ import net.minecraft.util.crash.CrashException;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
//#if MC >= 26.1
//$$ import net.minecraft.client.renderer.state.WindowRenderState;
//#endif
//#if MC>=12109 //#if MC>=12109
//$$ import net.minecraft.client.gui.screen.Overlay; //$$ import net.minecraft.client.gui.screen.Overlay;
//#endif //#endif
@@ -289,11 +293,15 @@ public class VideoRenderer implements RenderInfo {
//#if MC>=11600 //#if MC>=11600
int elapsedTicks = int elapsedTicks =
//#endif //#endif
//#if MC >= 26.1
//$$ timer.advanceGameTime(
//#else
timer.beginRenderTick( timer.beginRenderTick(
//#endif
//#if MC>=11400 //#if MC>=11400
MCVer.milliTime() MCVer.milliTime()
//#endif //#endif
//#if MC>=12100 //#if MC>=12100 && MC < 26.1
//$$ , true //$$ , true
//#endif //#endif
); );
@@ -525,6 +533,9 @@ public class VideoRenderer implements RenderInfo {
if (GLFW.glfwWindowShouldClose(window.getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) { if (GLFW.glfwWindowShouldClose(window.getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) {
return false; return false;
} }
//#if MC >= 26.1
//$$ RenderSystem.pollEvents();
//#endif
pushMatrix(); pushMatrix();
//#if MC>=12105 //#if MC>=12105
@@ -630,7 +641,11 @@ public class VideoRenderer implements RenderInfo {
//#if MC>=12106 //#if MC>=12106
//$$ GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer; //$$ GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer;
//#if MC >= 26.1
//$$ GuiRenderState guiRenderState = gameRenderer.getGameRenderState().guiRenderState;
//#else
//$$ GuiRenderState guiRenderState = gameRenderer.getGuiState(); //$$ GuiRenderState guiRenderState = gameRenderer.getGuiState();
//#endif
//$$ guiRenderState.clear(); //$$ guiRenderState.clear();
//#if MC>=12111 //#if MC>=12111
//$$ DrawContext drawContext = new DrawContext(mc, guiRenderState, mouseX, mouseY); //$$ DrawContext drawContext = new DrawContext(mc, guiRenderState, mouseX, mouseY);
@@ -641,6 +656,16 @@ public class VideoRenderer implements RenderInfo {
//$$ DrawContext drawContext = new DrawContext(mc, mc.getBufferBuilders().getEntityVertexConsumers()); //$$ DrawContext drawContext = new DrawContext(mc, mc.getBufferBuilders().getEntityVertexConsumers());
//#endif //#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) { if (mc.getOverlay() != null) {
Screen orgScreen = mc.currentScreen; Screen orgScreen = mc.currentScreen;
try { try {

View File

@@ -1420,8 +1420,13 @@ public class FullReplaySender extends ChannelInboundHandlerAdapter implements Re
//#if MC>=10904 //#if MC>=10904
if (p instanceof UnloadChunkS2CPacket) { if (p instanceof UnloadChunkS2CPacket) {
UnloadChunkS2CPacket packet = (UnloadChunkS2CPacket) p; UnloadChunkS2CPacket packet = (UnloadChunkS2CPacket) p;
//#if MC >= 26.1
//$$ int x = packet.pos().x();
//$$ int z = packet.pos().z();
//#else
int x = packet.getX(); int x = packet.getX();
int z = packet.getZ(); int z = packet.getZ();
//#endif
//#else //#else
//$$ if (p instanceof S21PacketChunkData && ((S21PacketChunkData) p).getExtractedSize() == 0) { //$$ if (p instanceof S21PacketChunkData && ((S21PacketChunkData) p).getExtractedSize() == 0) {
//$$ S21PacketChunkData packet = (S21PacketChunkData) p; //$$ S21PacketChunkData packet = (S21PacketChunkData) p;

View File

@@ -817,7 +817,11 @@ public class ReplayHandler {
//#endif //#endif
//#if MC>=12106 //#if MC>=12106
//$$ GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer; //$$ GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer;
//#if MC >= 26.1
//$$ GuiRenderState guiRenderState = gameRenderer.getGameRenderState().guiRenderState;
//#else
//$$ GuiRenderState guiRenderState = gameRenderer.getGuiState(); //$$ GuiRenderState guiRenderState = gameRenderer.getGuiState();
//#endif
//$$ guiRenderState.clear(); //$$ guiRenderState.clear();
//#if MC>=12111 //#if MC>=12111
//$$ int mouseX = (int) mc.mouse.getX() * window.getScaledWidth() / Math.max(window.getWidth(), 1); //$$ int mouseX = (int) mc.mouse.getX() * window.getScaledWidth() / Math.max(window.getWidth(), 1);
@@ -859,7 +863,9 @@ public class ReplayHandler {
//#endif //#endif
popMatrix(); popMatrix();
//#if MC>=12102 //#if MC >= 26.1
//$$ RenderSystem.flipFrame(null);
//#elseif MC>=12102
//$$ mc.getWindow().swapBuffers(null); //$$ mc.getWindow().swapBuffers(null);
//#elseif MC>=11500 //#elseif MC>=11500
mc.getWindow().swapBuffers(); mc.getWindow().swapBuffers();

View File

@@ -181,6 +181,9 @@ public class CameraEntity
//#endif //#endif
, false , false
//#endif //#endif
//#if MC >= 26.1
//$$ , mcIn.computeChatAbilities()
//#endif
); );
//#if MC>=10900 //#if MC>=10900
setUuid(CAMERA_UUID); setUuid(CAMERA_UUID);

View File

@@ -588,7 +588,7 @@ public class GuiHandler extends EventRegistrations {
: EMPTY : EMPTY
//#endif //#endif
//#if MC>=11903 //#if MC>=11903
//$$ , DEFAULT_NARRATION_SUPPLIER //$$ , ButtonWidget.DEFAULT_NARRATION_SUPPLIER
//#endif //#endif
); );
this.guiScreen = guiScreen; this.guiScreen = guiScreen;

View File

@@ -11,13 +11,23 @@ import org.spongepowered.asm.mixin.injection.ModifyArg;
@Mixin(TitleScreen.class) @Mixin(TitleScreen.class)
public abstract class Mixin_MoveRealmsButton { 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"; //$$ private static final String REALMS_INIT = "Lnet/minecraft/client/realms/gui/screen/RealmsNotificationsScreen;init(Lnet/minecraft/client/MinecraftClient;II)V";
//#else //#else
private static final String REALMS_INIT = "Lnet/minecraft/client/gui/screen/Screen;init(Lnet/minecraft/client/MinecraftClient;II)V"; private static final String REALMS_INIT = "Lnet/minecraft/client/gui/screen/Screen;init(Lnet/minecraft/client/MinecraftClient;II)V";
//#endif //#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) { private int adjustRealmsButton(int height) {
String setting = ReplayMod.instance.getSettingsRegistry().get(Setting.MAIN_MENU_BUTTON); String setting = ReplayMod.instance.getSettingsRegistry().get(Setting.MAIN_MENU_BUTTON);
if (MainMenuButtonPosition.valueOf(setting) == MainMenuButtonPosition.BIG) { if (MainMenuButtonPosition.valueOf(setting) == MainMenuButtonPosition.BIG) {

View File

@@ -354,9 +354,9 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
//$$ matrixStack.translate(-state.x2 / 2f, -state.y2, 100); //$$ matrixStack.translate(-state.x2 / 2f, -state.y2, 100);
//$$ for (Pair<Vector2f, Vector2f> line : state.lines) { //$$ for (Pair<Vector2f, Vector2f> line : state.lines) {
//#if MC>=12111 //#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 //#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 //#endif
//$$ } //$$ }
//$$ } //$$ }

View File

@@ -4,6 +4,9 @@
"mixins": [], "mixins": [],
"server": [], "server": [],
"client": [ "client": [
//#if MC >= 26.1
//$$ "BlockableEventLoopAccessor",
//#endif
"Mixin_ContextualKeyBindings", "Mixin_ContextualKeyBindings",
//#if MC>=11400 //#if MC>=11400
"AbstractButtonWidgetAccessor", "AbstractButtonWidgetAccessor",

View File

@@ -8,13 +8,9 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.Camera; import net.minecraft.client.render.Camera;
import net.minecraft.client.render.ChunkRenderingDataPreparer; import net.minecraft.client.render.ChunkRenderingDataPreparer;
import net.minecraft.client.render.Frustum; 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.WorldRenderer;
import net.minecraft.client.render.chunk.ChunkBuilder; import net.minecraft.client.render.chunk.ChunkBuilder;
import net.minecraft.client.render.chunk.ChunkRendererRegionBuilder; 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.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@@ -27,6 +23,11 @@ import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; 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) @Mixin(WorldRenderer.class)
public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading {
private ForceChunkLoadingHook replayModRender_hook; private ForceChunkLoadingHook replayModRender_hook;
@@ -46,7 +47,8 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading {
@Shadow @Final private ChunkRenderingDataPreparer field_45615; @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); //$$ @Shadow protected abstract void method_74752(Camera par1, Frustum par2, boolean par3);
//#else //#else
@Shadow protected abstract void setupTerrain(Camera par1, Frustum par2, boolean par3, boolean par4); @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); @Shadow protected abstract void applyFrustum(Frustum par1);
//#if MC >= 26.1
//$$ @WrapMethod(method = "update")
//$$ private void forceAllChunks(Camera camera, Operation<Void> original) {
//#else
@Inject(method = "render", at = @At(value = "INVOKE", target = SETUP_TERRAIN)) @Inject(method = "render", at = @At(value = "INVOKE", target = SETUP_TERRAIN))
private void forceAllChunks( private void forceAllChunks(
CallbackInfo ci, CallbackInfo ci,
@@ -68,10 +74,11 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading {
//#endif //#endif
@Local(argsOnly = true) Camera camera @Local(argsOnly = true) Camera camera
) { ) {
if (replayModRender_hook == null) { //#endif
return; if (replayModRender_hook == null || FlawlessFrames.hasSodium()) {
} //#if MC >= 26.1
if (FlawlessFrames.hasSodium()) { //$$ original.call(camera);
//#endif
return; return;
} }
@@ -85,7 +92,9 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading {
boolean areWeDoneYet = true; boolean areWeDoneYet = true;
// Determine which chunks shall be visible // 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()); //$$ method_74752(camera, frustum, this.client.player.isSpectator());
//#else //#else
setupTerrain(camera, this.frustum, this.capturedFrustum != null, this.client.player.isSpectator()); 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 // 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) // only done in the next setupTerrain call, which not happen this frame)
if (renderingData.method_52836()) { if (renderingData.method_52836()) {
this.applyFrustum((new Frustum(frustum)).coverBoxAroundSetPosition(8)); // call based on the one in setupTerrain 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 // 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) // all of them anyway and this way we can take advantage of threading)

View File

@@ -31,8 +31,23 @@ public abstract class MixinRenderManager {
copy.blockPos = org.blockPos; copy.blockPos = org.blockPos;
copy.pos = org.pos; copy.pos = org.pos;
copy.initialized = org.initialized; copy.initialized = org.initialized;
//#if MC < 26.1
copy.entityPos = org.entityPos; copy.entityPos = org.entityPos;
//#endif
copy.orientation.lookAlong((float) dx, (float) dy, (float) dz, 0f, 1f, 0f); 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); cameraRenderStateRef.set(copy);
} }
} }

View File

@@ -5,11 +5,14 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.blaze3d.textures.GpuTexture; import com.mojang.blaze3d.textures.GpuTexture;
import net.minecraft.client.gl.FramebufferManager; import net.minecraft.client.gl.FramebufferManager;
import net.minecraft.client.gl.GlResourceManager;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@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 { public class Mixin_FixCopyTextureToBuffer_DepthTexture {
@WrapOperation( @WrapOperation(
//#if MC>=12111 //#if MC>=12111

0
versions/26.1/.gitkeep Normal file
View File

View File

@@ -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<CrashReport> getDelayedCrash();
}

View File

@@ -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<Void> 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<ChunkSectionLayer, ?> chunkUberBuffers;
}

View File

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

View File

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

View File

@@ -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();
}
}

View File

@@ -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<Void> 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();
}
}

View File

@@ -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();
}
}

View File

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

View File

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

View File

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