diff --git a/build.gradle.kts b/build.gradle.kts index 1cb039c8..261015d5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -90,6 +90,7 @@ dependencies { 12102 -> "0.106.1+1.21.2" 12104 -> "0.111.0+1.21.4" 12105 -> "0.119.9+1.21.5" + 12107 -> "0.128.1+1.21.7" else -> throw UnsupportedOperationException() } val fabricApiModules = mutableListOf( @@ -168,6 +169,7 @@ dependencies { if (platform.isFabric) { val modMenuVersion = when { + mcVersion >= 12107 -> "15.0.0-beta.3" mcVersion >= 12105 -> "14.0.0-rc.2" mcVersion >= 12104 -> "13.0.0-beta.1" mcVersion >= 12102 -> "12.0.0-beta.1" diff --git a/gradle.properties b/gradle.properties index 55aa4b7d..5307edab 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.16.12 +essential.defaults.loom.fabric-loader=net.fabricmc:fabric-loader:0.16.14 # 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/jGui b/jGui index be4bf442..31106f5d 160000 --- a/jGui +++ b/jGui @@ -1 +1 @@ -Subproject commit be4bf44276032082dbac13d3511338f1a91e4c70 +Subproject commit 31106f5dae476e766306c20fc85d5fc7c1ea26eb diff --git a/libs/ReplayStudio b/libs/ReplayStudio index d23e0ec8..3fdc6c42 160000 --- a/libs/ReplayStudio +++ b/libs/ReplayStudio @@ -1 +1 @@ -Subproject commit d23e0ec82415e3c17f100500da847b4a69a517d8 +Subproject commit 3fdc6c42e36041ae666bcba174a638569dc2791d diff --git a/root.gradle.kts b/root.gradle.kts index e5358aaa..f11f809c 100755 --- a/root.gradle.kts +++ b/root.gradle.kts @@ -204,6 +204,7 @@ defaultTasks("bundleJar") preprocess { strictExtraMappings.set(true) + val mc12107 = createNode("1.21.7", 12107, "yarn") val mc12105 = createNode("1.21.5", 12105, "yarn") val mc12104 = createNode("1.21.4", 12104, "yarn") val mc12102 = createNode("1.21.2", 12102, "yarn") @@ -236,6 +237,7 @@ preprocess { val mc10800 = createNode("1.8", 10800, "srg") val mc10710 = createNode("1.7.10", 10710, "srg") + mc12107.link(mc12105) mc12105.link(mc12104, file("versions/mapping-fabric-1.21.5-1.21.4.txt")) mc12104.link(mc12102) mc12102.link(mc12100) diff --git a/settings.gradle.kts b/settings.gradle.kts index 787556d6..0c43f946 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -43,6 +43,7 @@ val jGuiVersions = listOf( "1.21.2", "1.21.4", "1.21.5", + "1.21.7", ) val replayModVersions = listOf( // "1.7.10", @@ -76,6 +77,7 @@ val replayModVersions = listOf( "1.21.2", "1.21.4", "1.21.5", + "1.21.7", ) rootProject.buildFileName = "root.gradle.kts" diff --git a/src/main/java/com/replaymod/core/ReplayModBackend.java b/src/main/java/com/replaymod/core/ReplayModBackend.java index 2e120df9..3f06dee1 100644 --- a/src/main/java/com/replaymod/core/ReplayModBackend.java +++ b/src/main/java/com/replaymod/core/ReplayModBackend.java @@ -21,7 +21,11 @@ public class ReplayModBackend implements ClientModInitializer { } public String getMinecraftVersion() { + //#if MC>=12106 + //$$ return SharedConstants.getGameVersion().comp_4025(); + //#else return SharedConstants.getGameVersion().getName(); + //#endif } public boolean isModLoaded(String id) { diff --git a/src/main/java/com/replaymod/core/mixin/Mixin_PreRenderHandCallback.java b/src/main/java/com/replaymod/core/mixin/Mixin_PreRenderHandCallback.java index 012c93eb..b0a1dae0 100644 --- a/src/main/java/com/replaymod/core/mixin/Mixin_PreRenderHandCallback.java +++ b/src/main/java/com/replaymod/core/mixin/Mixin_PreRenderHandCallback.java @@ -2,32 +2,16 @@ package com.replaymod.core.mixin; import com.replaymod.core.events.PreRenderHandCallback; -import net.minecraft.client.render.Camera; import net.minecraft.client.render.GameRenderer; -import net.minecraft.client.util.math.MatrixStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//#if MC>=12005 -//$$ import org.joml.Matrix4f; -//#else -//#endif - @Mixin(GameRenderer.class) public class Mixin_PreRenderHandCallback { @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) - private void preRenderHand( - //#if MC>=11500 && MC<12005 - MatrixStack matrixStack, - //#endif - Camera camera, - float partialTicks, - //#if MC>=12005 - //$$ Matrix4f matrixStack, - //#endif - CallbackInfo ci) { + private void preRenderHand(CallbackInfo ci) { if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) { ci.cancel(); } diff --git a/src/main/java/com/replaymod/core/versions/MCVer.java b/src/main/java/com/replaymod/core/versions/MCVer.java index 912cb77f..53ba8446 100644 --- a/src/main/java/com/replaymod/core/versions/MCVer.java +++ b/src/main/java/com/replaymod/core/versions/MCVer.java @@ -102,7 +102,9 @@ import java.util.Optional; */ public class MCVer { public static int getProtocolVersion() { - //#if MC>=11400 + //#if MC>=12106 + //$$ return SharedConstants.getProtocolVersion(); + //#elseif MC>=11400 return SharedConstants.getGameVersion().getProtocolVersion(); //#else //$$ return RealmsSharedConstants.NETWORK_PROTOCOL_VERSION; @@ -488,9 +490,11 @@ public class MCVer { buffer.next(); } + //#if MC<12105 public static void bindTexture(Identifier id) { de.johni0702.minecraft.gui.versions.MCVer.bindTexture(id); } + //#endif //#if MC<10900 //$$ public static class SoundEvent {} diff --git a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java index a273d8da..8a7b9b22 100644 --- a/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java +++ b/src/main/java/com/replaymod/pathing/properties/SpectatorProperty.java @@ -35,7 +35,11 @@ public class SpectatorProperty extends AbstractProperty { ReplayHandler handler = ((ReplayHandler) replayHandler); CameraEntity cameraEntity = handler.getCameraEntity(); if (cameraEntity == null) return; + //#if MC>=12106 + //$$ World world = cameraEntity.getWorld(); + //#else World world = cameraEntity.getEntityWorld(); + //#endif // Lookup entity by id, returns null if an entity with the id does not exists Entity target = world.getEntityById(value); // Spectate entity, when called with null, returns to camera diff --git a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java index 7077535d..37d313f0 100644 --- a/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/OpenGlFrameCapturer.java @@ -24,8 +24,10 @@ import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; //#if MC>=12105 +//#if MC<12106 //$$ import com.mojang.blaze3d.buffers.BufferType; //$$ import com.mojang.blaze3d.buffers.BufferUsage; +//#endif //$$ import com.mojang.blaze3d.buffers.GpuBuffer; //$$ import com.mojang.blaze3d.systems.GpuDevice; //#endif @@ -121,9 +123,17 @@ public abstract class OpenGlFrameCapturer=12105 //$$ GpuDevice device = RenderSystem.getDevice(); + //#if MC>=12106 + //$$ try (GpuBuffer gpuBuffer = device.createBuffer(null, GpuBuffer.USAGE_COPY_DST | GpuBuffer.USAGE_MAP_READ, getFrameWidth() * getFrameHeight() * 4)) { + //#else //$$ try (GpuBuffer gpuBuffer = device.createBuffer(null, BufferType.PIXEL_PACK, BufferUsage.STATIC_READ, getFrameWidth() * getFrameHeight() * 4)) { + //#endif //$$ device.createCommandEncoder().copyTextureToBuffer(frameBuffer().getColorAttachment(), gpuBuffer, 0, () -> {}, 0); - //$$ try (GpuBuffer.ReadView view = device.createCommandEncoder().readBuffer(gpuBuffer)) { + //#if MC>=12106 + //$$ try (GpuBuffer.MappedView view = device.createCommandEncoder().mapBuffer(gpuBuffer, true, false)) { + //#else + //$$ try (GpuBuffer.ReadView view = device.createCommandEncoder().readBuffer(gpuBuffer)) { + //#endif //$$ buffer.put(view.data()); //$$ } //$$ } diff --git a/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java index ca13b385..c44a0b26 100644 --- a/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/PboOpenGlFrameCapturer.java @@ -14,8 +14,10 @@ import java.util.HashMap; import java.util.Map; //#if MC>=12105 +//#if MC<12106 //$$ import com.mojang.blaze3d.buffers.BufferType; //$$ import com.mojang.blaze3d.buffers.BufferUsage; +//#endif //$$ import com.mojang.blaze3d.buffers.GpuBuffer; //$$ import com.mojang.blaze3d.systems.CommandEncoder; //$$ import com.mojang.blaze3d.systems.GpuDevice; @@ -38,7 +40,10 @@ public abstract class PboOpenGlFrameCapturer withDepth = renderInfo.getRenderSettings().isDepthMap(); data = type.getEnumConstants(); int bufferSize = framePixels * (4 /* bgra */ + (withDepth ? 4 /* float */ : 0)) * data.length; - //#if MC>=12105 + //#if MC>=12106 + //$$ pbo = RenderSystem.getDevice().createBuffer(null, GpuBuffer.USAGE_COPY_DST | GpuBuffer.USAGE_MAP_READ, bufferSize); + //$$ otherPBO = RenderSystem.getDevice().createBuffer(null, GpuBuffer.USAGE_COPY_DST | GpuBuffer.USAGE_MAP_READ, bufferSize); + //#elseif MC>=12105 //$$ pbo = RenderSystem.getDevice().createBuffer(null, BufferType.PIXEL_PACK, BufferUsage.STREAM_READ, bufferSize); //$$ otherPBO = RenderSystem.getDevice().createBuffer(null, BufferType.PIXEL_PACK, BufferUsage.STREAM_READ, bufferSize); //#else @@ -97,7 +102,11 @@ public abstract class PboOpenGlFrameCapturer if (framesDone > 1) { // Read pbo to memory //#if MC>=12105 + //#if MC>=12106 + //$$ try (GpuBuffer.MappedView view = RenderSystem.getDevice().createCommandEncoder().mapBuffer(pbo, true, false)) { + //#else //$$ try (GpuBuffer.ReadView view = RenderSystem.getDevice().createCommandEncoder().readBuffer(pbo)) { + //#endif //$$ channels = new HashMap<>(); //$$ channels.put(Channel.BRGA, readFromPbo(view.data(), 4, true)); //$$ if (withDepth) { diff --git a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java index 7695388b..0aaf6204 100644 --- a/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java +++ b/src/main/java/com/replaymod/render/hooks/EntityRendererHandler.java @@ -88,12 +88,21 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer; Screen orgScreen = mc.currentScreen; boolean orgPauseOnLostFocus = mc.options.pauseOnLostFocus; + //#if MC>=12106 + //$$ boolean orgRenderHand = mc.gameRenderer.isRenderingPanorama(); + //#else boolean orgRenderHand = gameRenderer.getRenderHand(); + //#endif try { mc.currentScreen = null; // do not want to render the current screen (that'd just be the progress gui) mc.options.pauseOnLostFocus = false; // do not want the pause menu to open if the window is unfocused if (omnidirectional) { - gameRenderer.setRenderHand(false); // 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>=12106 + //$$ mc.gameRenderer.setRenderingPanorama(false); + //#else + gameRenderer.setRenderHand(false); + //#endif } //#if MC>=12100 @@ -111,7 +120,11 @@ public class EntityRendererHandler extends EventRegistrations implements WorldRe } finally { mc.currentScreen = orgScreen; mc.options.pauseOnLostFocus = orgPauseOnLostFocus; + //#if MC>=12106 + //$$ mc.gameRenderer.setRenderingPanorama(orgRenderHand); + //#else gameRenderer.setRenderHand(orgRenderHand); + //#endif } } diff --git a/src/main/java/com/replaymod/render/mixin/GameRendererAccessor.java b/src/main/java/com/replaymod/render/mixin/GameRendererAccessor.java index e74e16bc..1f6f09ed 100644 --- a/src/main/java/com/replaymod/render/mixin/GameRendererAccessor.java +++ b/src/main/java/com/replaymod/render/mixin/GameRendererAccessor.java @@ -4,10 +4,30 @@ import net.minecraft.client.render.GameRenderer; import org.spongepowered.asm.mixin.Mixin; 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 + @Mixin(GameRenderer.class) public interface GameRendererAccessor { + //#if MC<12106 @Accessor boolean getRenderHand(); @Accessor void setRenderHand(boolean value); + //#endif + + //#if MC>=12106 + //$$ @Accessor + //$$ Pool getPool(); + //$$ @Accessor + //$$ GuiRenderer getGuiRenderer(); + //$$ @Accessor + //$$ GuiRenderState getGuiState(); + //$$ @Accessor + //$$ FogRenderer getFogRenderer(); + //#endif } diff --git a/src/main/java/com/replaymod/render/mixin/Mixin_BlockOnChunkRebuilds.java b/src/main/java/com/replaymod/render/mixin/Mixin_BlockOnChunkRebuilds.java index ab139d2d..74493e02 100644 --- a/src/main/java/com/replaymod/render/mixin/Mixin_BlockOnChunkRebuilds.java +++ b/src/main/java/com/replaymod/render/mixin/Mixin_BlockOnChunkRebuilds.java @@ -21,6 +21,12 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +//#if MC>=12106 +//$$ import net.minecraft.client.render.chunk.AbstractChunkRenderData; +//$$ import org.spongepowered.asm.mixin.Mutable; +//$$ import java.util.concurrent.Executor; +//#endif + //#if MC>=12105 //$$ import org.spongepowered.asm.mixin.Mutable; //$$ import java.util.AbstractQueue; @@ -60,6 +66,13 @@ public abstract class Mixin_BlockOnChunkRebuilds implements ForceChunkLoadingHoo //$$ runnable.run(); //$$ anything = true; //$$ } + //#if MC>=12106 + //$$ AbstractChunkRenderData entry; + //$$ while ((entry = this.renderQueue.poll()) != null) { + //$$ entry.close(); + //$$ anything = true; + //$$ } + //#endif //$$ return anything; //$$ } //#else @@ -105,7 +118,42 @@ public abstract class Mixin_BlockOnChunkRebuilds implements ForceChunkLoadingHoo } } - //#if MC>=12105 + //#if MC>=12106 + //$$ @Shadow @Final @Mutable + //$$ Executor uploadExecutor; + //$$ @Shadow @Final @Mutable Queue renderQueue; + //$$ @Inject(method = "", at = @At("RETURN")) + //$$ private void notifyMainThreadOfNewUpload(CallbackInfo ci) { + //$$ Executor innerUploadExecutor = this.uploadExecutor; + //$$ this.uploadExecutor = runnable -> { + //$$ innerUploadExecutor.execute(runnable); + //$$ waitingForWorkLock.lock(); + //$$ try { + //$$ newWork.signal(); + //$$ } finally { + //$$ waitingForWorkLock.unlock(); + //$$ } + //$$ }; + //$$ Queue innerRenderQueue = this.renderQueue; + //$$ this.renderQueue = new AbstractQueue<>() { + //$$ @Override + //$$ public boolean offer(AbstractChunkRenderData runnable) { + //$$ boolean result = innerRenderQueue.offer(runnable); + //$$ waitingForWorkLock.lock(); + //$$ try { + //$$ newWork.signal(); + //$$ } finally { + //$$ waitingForWorkLock.unlock(); + //$$ } + //$$ return result; + //$$ } + //$$ @Override public AbstractChunkRenderData poll() { return innerRenderQueue.poll(); } + //$$ @Override public AbstractChunkRenderData peek() { return innerRenderQueue.peek(); } + //$$ @Override public int size() { return innerRenderQueue.size(); } + //$$ @Override public Iterator iterator() { return innerRenderQueue.iterator(); } + //$$ }; + //$$ } + //#elseif MC>=12105 //$$ @Inject(method = "", at = @At("RETURN")) //$$ private void notifyMainThreadOfNewUpload(CallbackInfo ci) { //$$ Queue inner = this.uploadQueue; diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index 5cf84bee..d3c5d21f 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -40,6 +40,14 @@ import net.minecraft.util.crash.CrashException; import net.minecraft.sound.SoundCategory; import org.lwjgl.glfw.GLFW; +//#if MC>=12106 +//$$ import com.replaymod.render.mixin.GameRendererAccessor; +//$$ import net.minecraft.client.gui.render.GuiRenderer; +//$$ import net.minecraft.client.gui.render.state.GuiRenderState; +//$$ import net.minecraft.client.render.fog.FogRenderer; +//$$ import java.util.Collections; +//#endif + //#if MC>=12102 //$$ import com.mojang.blaze3d.systems.ProjectionType; //#endif @@ -523,7 +531,8 @@ public class VideoRenderer implements RenderInfo { RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC); //#endif //#endif - //#if MC>=11700 + //#if MC>=12106 + //#elseif MC>=11700 //$$ RenderSystem.setProjectionMatrix(Matrix4f.projectionMatrix( //$$ 0, //$$ (float) (window.getFramebufferWidth() / window.getScaleFactor()), @@ -591,7 +600,12 @@ public class VideoRenderer implements RenderInfo { int mouseX = (int) mc.mouse.getX() * window.getScaledWidth() / Math.max(window.getWidth(), 1); int mouseY = (int) mc.mouse.getY() * window.getScaledHeight() / Math.max(window.getHeight(), 1); - //#if MC>=12000 + //#if MC>=12106 + //$$ GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer; + //$$ GuiRenderState guiRenderState = gameRenderer.getGuiState(); + //$$ guiRenderState.clear(); + //$$ DrawContext drawContext = new DrawContext(mc, guiRenderState); + //#elseif MC>=12000 //$$ DrawContext drawContext = new DrawContext(mc, mc.getBufferBuilders().getEntityVertexConsumers()); //#endif @@ -611,15 +625,26 @@ public class VideoRenderer implements RenderInfo { } } else { gui.toMinecraft().tick(); + //#if MC>=12106 + //$$ gui.toMinecraft().renderWithTooltip( + //#else gui.toMinecraft().render( + //#endif //#if MC>=12000 - //$$ new DrawContext(mc, mc.getBufferBuilders().getEntityVertexConsumers()), + //$$ drawContext, //#elseif MC>=11600 new MatrixStack(), //#endif mouseX, mouseY, 0); } - //#if MC>=12000 + //#if MC>=12106 + //$$ var orgFog = RenderSystem.getShaderFog(); + //$$ var orgProjBuf = RenderSystem.getProjectionMatrixBuffer(); + //$$ var orgProjType = RenderSystem.getProjectionType(); + //$$ gameRenderer.getGuiRenderer().render(gameRenderer.getFogRenderer().getFogBuffer(FogRenderer.FogType.NONE)); + //$$ RenderSystem.setShaderFog(orgFog); + //$$ RenderSystem.setProjectionMatrix(orgProjBuf, orgProjType); + //#elseif MC>=12000 //$$ drawContext.draw(); //#endif //#else diff --git a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java index 9f77a970..b1a0f4c6 100644 --- a/src/main/java/com/replaymod/replay/NoGuiScreenshot.java +++ b/src/main/java/com/replaymod/replay/NoGuiScreenshot.java @@ -12,8 +12,10 @@ import static com.replaymod.core.versions.MCVer.popMatrix; import static com.replaymod.core.versions.MCVer.pushMatrix; //#if MC>=12105 +//#if MC<12106 //$$ import com.mojang.blaze3d.buffers.BufferType; //$$ import com.mojang.blaze3d.buffers.BufferUsage; +//#endif //$$ import com.mojang.blaze3d.buffers.GpuBuffer; //$$ import com.mojang.blaze3d.systems.CommandEncoder; //$$ import com.mojang.blaze3d.systems.GpuDevice; @@ -136,10 +138,18 @@ public class NoGuiScreenshot { //#if MC>=12105 //$$ Image image; //$$ GpuDevice device = RenderSystem.getDevice(); + //#if MC>=12106 + //$$ try (GpuBuffer gpuBuffer = device.createBuffer(null, GpuBuffer.USAGE_COPY_DST | GpuBuffer.USAGE_MAP_READ, frameWidth * frameHeight * 4)) { + //#else //$$ try (GpuBuffer gpuBuffer = device.createBuffer(null, BufferType.PIXEL_PACK, BufferUsage.STATIC_READ, frameWidth * frameHeight * 4)) { + //#endif //$$ CommandEncoder cmd = device.createCommandEncoder(); //$$ cmd.copyTextureToBuffer(mc.getFramebuffer().getColorAttachment(), gpuBuffer, 0, () -> {}, 0); - //$$ try (GpuBuffer.ReadView readView = cmd.readBuffer(gpuBuffer)) { + //#if MC>=12106 + //$$ try (GpuBuffer.MappedView readView = cmd.mapBuffer(gpuBuffer, true, false)) { + //#else + //$$ try (GpuBuffer.ReadView readView = cmd.readBuffer(gpuBuffer)) { + //#endif //$$ NativeImage nativeImage = new NativeImage(frameWidth, frameHeight, false); //$$ for (int y = 0; y < frameHeight; ++y) { //$$ for (int x = 0; x < frameWidth; ++x) { diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 192f458c..5b6454df 100644 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -45,6 +45,12 @@ import net.minecraft.network.ClientConnection; import java.io.IOException; import java.util.*; +//#if MC>=12106 +//$$ import com.replaymod.render.mixin.GameRendererAccessor; +//$$ import net.minecraft.client.gui.render.state.GuiRenderState; +//$$ import net.minecraft.client.render.fog.FogRenderer; +//#endif + //#if MC>=12105 //$$ import net.minecraft.entity.PositionInterpolator; //#endif @@ -219,7 +225,9 @@ public class ReplayHandler { //#endif // Force re-creation of camera entity by unloading the previous world - //#if MC>=11400 + //#if MC>=12106 + //$$ mc.disconnectWithProgressScreen(); + //#elseif MC>=11400 mc.disconnect(); //#else //$$ // We need to re-set the GUI screen because having one with `allowsUserInput = true` active during world @@ -261,7 +269,9 @@ public class ReplayHandler { } if (mc.world != null) { - //#if MC>=11400 + //#if MC>=12106 + //$$ mc.disconnectWithProgressScreen(); + //#elseif MC>=11400 mc.disconnect(); //#else //$$ mc.world.sendQuittingDisconnectingPacket(); @@ -743,7 +753,8 @@ public class ReplayHandler { RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC); //#endif //#endif - //#if MC>=11700 + //#if MC>=12106 + //#elseif MC>=11700 //$$ RenderSystem.setProjectionMatrix(Matrix4f.projectionMatrix( //$$ 0, //$$ (float) (window.getFramebufferWidth() / window.getScaleFactor()), @@ -787,7 +798,18 @@ public class ReplayHandler { //#endif guiScreen.toMinecraft().init(mc, window.getScaledWidth(), window.getScaledHeight()); - //#if MC>=12000 + //#if MC>=12106 + //$$ GameRendererAccessor gameRenderer = (GameRendererAccessor) mc.gameRenderer; + //$$ GuiRenderState guiRenderState = gameRenderer.getGuiState(); + //$$ guiRenderState.clear(); + //$$ guiScreen.toMinecraft().renderWithTooltip(new DrawContext(mc, guiRenderState), 0, 0, 0); + //$$ var orgFog = RenderSystem.getShaderFog(); + //$$ var orgProjBuf = RenderSystem.getProjectionMatrixBuffer(); + //$$ var orgProjType = RenderSystem.getProjectionType(); + //$$ gameRenderer.getGuiRenderer().render(gameRenderer.getFogRenderer().getFogBuffer(FogRenderer.FogType.NONE)); + //$$ RenderSystem.setShaderFog(orgFog); + //$$ RenderSystem.setProjectionMatrix(orgProjBuf, orgProjType); + //#elseif MC>=12000 //$$ DrawContext drawContext = new DrawContext(mc, mc.getBufferBuilders().getEntityVertexConsumers()); //$$ guiScreen.toMinecraft().render(drawContext, 0, 0, 0); //$$ drawContext.draw(); diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index 024d56a1..1e16cf61 100644 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -31,6 +31,10 @@ import net.minecraft.stat.StatHandler; import net.minecraft.util.Identifier; import net.minecraft.util.math.Box; +//#if MC>=12106 +//$$ import net.minecraft.util.PlayerInput; +//#endif + //#if FABRIC>=1 //#else //$$ import net.minecraftforge.client.event.EntityViewRenderEvent; @@ -164,7 +168,11 @@ public class CameraEntity , recipeBook //#endif //#if MC>=11600 + //#if MC>=12106 + //$$ , PlayerInput.DEFAULT + //#else , false + //#endif , false //#endif ); diff --git a/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java b/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java index 2949eba2..93598d78 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java @@ -1,39 +1,16 @@ package com.replaymod.replay.mixin; -import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.client.network.ClientPlayNetworkHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#if MC>=11400 -import net.minecraft.client.world.ClientWorld; -//#else -//$$ import net.minecraft.world.World; -//#endif - -//#if MC>=11200 -//#if MC>=11400 -import net.minecraft.client.recipebook.ClientRecipeBook; -//#else -//$$ import net.minecraft.stats.RecipeBook; -//#endif -//#endif -//#if MC>=10904 -import net.minecraft.stat.StatHandler; -//#else -//$$ import net.minecraft.stats.StatFileWriter; -//#endif - //#if MC>=10800 -import net.minecraft.client.network.ClientPlayerEntity; //#else -//$$ import net.minecraft.client.entity.EntityClientPlayerMP; //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //#endif @@ -43,66 +20,6 @@ public abstract class MixinPlayerControllerMP { @Shadow private MinecraftClient client; - @Shadow - //#if MC>=10904 - private ClientPlayNetworkHandler networkHandler; - //#else - //$$ private NetHandlerPlayClient netClientHandler; - //#endif - - //#if MC>=11400 - //#if MC>=11602 - @Inject(method = "createPlayer(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/stat/StatHandler;Lnet/minecraft/client/recipebook/ClientRecipeBook;ZZ)Lnet/minecraft/client/network/ClientPlayerEntity;", at=@At("HEAD"), cancellable = true) - //#else - //$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true) - //#endif - private void replayModReplay_createReplayCamera( - //#if MC>=11400 - ClientWorld worldIn, - //#else - //$$ World worldIn, - //#endif - StatHandler statisticsManager, - ClientRecipeBook recipeBookClient, - //#if MC>=11600 - boolean lastIsHoldingSneakKey, - boolean lastSprinting, - //#endif - CallbackInfoReturnable ci - ) { - if (ReplayModReplay.instance.getReplayHandler() != null) { - ci.setReturnValue(new CameraEntity(this.client, worldIn, this.networkHandler, statisticsManager, recipeBookClient)); - //#else - //#if MC>=11200 - //$$ @Inject(method = "func_192830_a", at=@At("HEAD"), cancellable = true) - //$$ private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, RecipeBook recipeBook, CallbackInfoReturnable ci) { - //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { - //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.connection, statisticsManager, recipeBook)); - //#else - //#if MC>=10904 - //$$ @Inject(method = "createClientPlayer", at=@At("HEAD"), cancellable = true) - //$$ private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, CallbackInfoReturnable ci) { - //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { - //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.connection, statisticsManager)); - //#else - //#if MC>=10800 - //$$ @Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true) - //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { - //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { - //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.netClientHandler, statFileWriter)); - //#else - //$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true) - //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { - //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { - //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.mc.getSession(), this.netClientHandler, statFileWriter)); - //#endif - //#endif - //#endif - //#endif - ci.cancel(); - } - } - //#if MC>=10800 //#if MC>=11400 @Inject(method = "isFlyingLocked", at=@At("HEAD"), cancellable = true) @@ -117,6 +34,9 @@ public abstract class MixinPlayerControllerMP { //#endif //#if MC<=10710 + //$$ @Shadow + //$$ private NetHandlerPlayClient netClientHandler; + //$$ //$$ // Prevent the disconnect GUI from being opened during the short time when the replay is restarted //$$ // at which the old network manager is closed but still getting ticked (hence the disconnect GUI opening). //$$ @Inject(method = "updateController", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/com/replaymod/replay/mixin/Mixin_CreateReplayCamera.java b/src/main/java/com/replaymod/replay/mixin/Mixin_CreateReplayCamera.java new file mode 100644 index 00000000..7abcae6b --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/Mixin_CreateReplayCamera.java @@ -0,0 +1,115 @@ +package com.replaymod.replay.mixin; + +import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerInteractionManager; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +//#if MC>=12106 +//$$ import net.minecraft.util.PlayerInput; +//#endif + +//#if MC>=11400 +import net.minecraft.client.world.ClientWorld; +//#else +//$$ import net.minecraft.world.World; +//#endif + +//#if MC>=11200 +//#if MC>=11400 +import net.minecraft.client.recipebook.ClientRecipeBook; +//#else +//$$ import net.minecraft.stats.RecipeBook; +//#endif +//#endif +//#if MC>=10904 +import net.minecraft.stat.StatHandler; +//#else +//$$ import net.minecraft.stats.StatFileWriter; +//#endif + +//#if MC>=10800 +import net.minecraft.client.network.ClientPlayerEntity; +//#else +//$$ import net.minecraft.client.entity.EntityClientPlayerMP; +//#endif + + +@Mixin(ClientPlayerInteractionManager.class) +public abstract class Mixin_CreateReplayCamera { + + @Shadow + private MinecraftClient client; + + @Shadow + //#if MC>=10904 + private ClientPlayNetworkHandler networkHandler; + //#else + //$$ private NetHandlerPlayClient netClientHandler; + //#endif + + //#if MC>=11400 + //#if MC>=12106 + //$$ @Inject(method = "createPlayer(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/stat/StatHandler;Lnet/minecraft/client/recipebook/ClientRecipeBook;Lnet/minecraft/util/PlayerInput;Z)Lnet/minecraft/client/network/ClientPlayerEntity;", at=@At("HEAD"), cancellable = true) + //#elseif MC>=11602 + @Inject(method = "createPlayer(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/stat/StatHandler;Lnet/minecraft/client/recipebook/ClientRecipeBook;ZZ)Lnet/minecraft/client/network/ClientPlayerEntity;", at=@At("HEAD"), cancellable = true) + //#else + //$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true) + //#endif + private void replayModReplay_createReplayCamera( + //#if MC>=11400 + ClientWorld worldIn, + //#else + //$$ World worldIn, + //#endif + StatHandler statisticsManager, + ClientRecipeBook recipeBookClient, + //#if MC>=11600 + //#if MC>=12106 + //$$ PlayerInput playerInput, + //#else + boolean lastIsHoldingSneakKey, + //#endif + boolean lastSprinting, + //#endif + CallbackInfoReturnable ci + ) { + if (ReplayModReplay.instance.getReplayHandler() != null) { + ci.setReturnValue(new CameraEntity(this.client, worldIn, this.networkHandler, statisticsManager, recipeBookClient)); + //#else + //#if MC>=11200 + //$$ @Inject(method = "func_192830_a", at=@At("HEAD"), cancellable = true) + //$$ private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, RecipeBook recipeBook, CallbackInfoReturnable ci) { + //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { + //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.connection, statisticsManager, recipeBook)); + //#else + //#if MC>=10904 + //$$ @Inject(method = "createClientPlayer", at=@At("HEAD"), cancellable = true) + //$$ private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, CallbackInfoReturnable ci) { + //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { + //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.connection, statisticsManager)); + //#else + //#if MC>=10800 + //$$ @Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true) + //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { + //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { + //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.netClientHandler, statFileWriter)); + //#else + //$$ @Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true) + //$$ private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { + //$$ if (ReplayModReplay.instance.getReplayHandler() != null) { + //$$ ci.setReturnValue(new CameraEntity(this.mc, worldIn, this.mc.getSession(), this.netClientHandler, statFileWriter)); + //#endif + //#endif + //#endif + //#endif + ci.cancel(); + } + } +} diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java index 44cb8b46..ace2201f 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java @@ -37,6 +37,22 @@ import static de.johni0702.minecraft.gui.versions.MCVer.popScissorState; import static de.johni0702.minecraft.gui.versions.MCVer.pushScissorState; import static de.johni0702.minecraft.gui.versions.MCVer.setScissorDisabled; +//#if MC>=12106 +//$$ import com.replaymod.replay.mixin.DrawContextAccessor; +//$$ import com.replaymod.render.mixin.GameRendererAccessor; +//$$ import net.minecraft.client.MinecraftClient; +//$$ import net.minecraft.client.gui.ScreenRect; +//$$ import net.minecraft.client.gui.render.SpecialGuiElementRenderer; +//$$ import net.minecraft.client.gui.render.state.special.SpecialGuiElementRenderState; +//$$ import net.minecraft.client.util.ClosableFactory; +//$$ import net.minecraft.client.util.Pool; +//$$ import net.minecraft.client.render.RenderLayer; +//$$ import net.minecraft.client.render.VertexConsumerProvider; +//$$ import org.jetbrains.annotations.Nullable; +//$$ import java.util.ArrayList; +//$$ import java.util.List; +//#endif + //#if MC>=12105 //$$ import net.minecraft.client.render.RenderLayer; //$$ import net.minecraft.client.render.VertexConsumer; @@ -116,6 +132,10 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline=12106 + //$$ TimeTimelineLinesRenderState linesRenderState = new TimeTimelineLinesRenderState(); + //#endif + SPTimeline timeline = mod.getCurrentTimeline(); timeline.getTimeline().getPaths().stream().flatMap(path -> path.getKeyframes().stream()).forEach(keyframe -> { @@ -188,6 +208,12 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline=12106 + //$$ linesRenderState.color = color; + //$$ linesRenderState.line(p1, p2); + //$$ linesRenderState.line(p2, p3); + //$$ linesRenderState.line(p3, p4); + //#else MatrixStack matrixStack = renderer.getMatrixStack(); emitLine(matrixStack, buffer, p1, p2, color); emitLine(matrixStack, buffer, p2, p3, color); @@ -222,10 +248,31 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline=12106 + //$$ if (!linesRenderState.lines.isEmpty()) { + //$$ MinecraftClient mc = getMinecraft(); + //$$ int scale = mc.getWindow().getScaleFactor(); + //$$ // MC's special rendering code has multiple issues, we'll use a size matching the screen to avoid some + //$$ linesRenderState.x1 = 0; + //$$ linesRenderState.y1 = 0; + //$$ linesRenderState.x2 = mc.getWindow().getFramebufferWidth() / scale; + //$$ linesRenderState.y2 = mc.getWindow().getFramebufferHeight() / scale; + //$$ + //$$ Pool pool = ((GameRendererAccessor) mc.gameRenderer).getPool(); + //$$ TimeTimelineLinesRenderer linesRenderer = pool.acquire(TimeTimelineLinesRenderer.FACTORY); + //$$ pushScissorState(); + //$$ setScissorDisabled(); + //$$ linesRenderer.render(linesRenderState, ((DrawContextAccessor) renderer.getContext()).getState(), scale); + //$$ popScissorState(); + //$$ pool.release(TimeTimelineLinesRenderer.FACTORY, linesRenderer); // Note: Assumes we only render one per frame + //$$ } + //#endif + // Draw colored quads on spectator path segments for (PathSegment segment : timeline.getPositionPath().getSegments()) { if (segment.getInterpolator() == null @@ -248,6 +295,65 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline=12106 + //$$ private static class TimeTimelineLinesRenderState implements SpecialGuiElementRenderState { + //$$ int x1, x2, y1, y2; + //$$ ScreenRect scissorState; + //$$ + //$$ List> lines = new ArrayList<>(); + //$$ int color; + //$$ + //$$ public void line(Vector2f p1, Vector2f p2) { + //$$ lines.add(Pair.of(p1, p2)); + //$$ } + //$$ + //$$ @Override public int x1() {return x1;} + //$$ @Override public int x2() {return x2;} + //$$ @Override public int y1() {return y1;} + //$$ @Override public int y2() {return y2;} + //$$ @Override public float comp_4133() {return 1; /* scale */} + //$$ @Override public @Nullable ScreenRect comp_4128() {return scissorState;} + //$$ @Override public @Nullable ScreenRect comp_4274() {return SpecialGuiElementRenderState.createBounds(x1, y1, x2, y2, scissorState);} + //$$ } + //$$ + //$$ private static class TimeTimelineLinesRenderer extends SpecialGuiElementRenderer { + //$$ private static ClosableFactory FACTORY = new ClosableFactory<>() { + //$$ @Override + //$$ public TimeTimelineLinesRenderer create() { + //$$ return new TimeTimelineLinesRenderer(MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers()); + //$$ } + //$$ + //$$ @Override + //$$ public void close(TimeTimelineLinesRenderer object) { + //$$ object.close(); + //$$ } + //$$ }; + //$$ + //$$ protected TimeTimelineLinesRenderer(VertexConsumerProvider.Immediate immediate) { + //$$ super(immediate); + //$$ } + //$$ + //$$ @Override + //$$ public Class getElementClass() { + //$$ return TimeTimelineLinesRenderState.class; + //$$ } + //$$ + //$$ @Override + //$$ protected void render(TimeTimelineLinesRenderState state, MatrixStack matrixStack) { + //$$ matrixStack.translate(-state.x2 / 2f, -state.y2, 100); + //$$ RenderSystem.lineWidth(2); + //$$ for (Pair line : state.lines) { + //$$ emitLine(matrixStack, vertexConsumers.getBuffer(RenderLayer.LINES), line.getLeft(), line.getRight(), state.color); + //$$ } + //$$ } + //$$ + //$$ @Override + //$$ protected String getName() { + //$$ return "time_timeline_lines"; + //$$ } + //$$ } + //#endif + private void drawQuadOnSegment(GuiRenderer renderer, int visibleWidth, PathSegment segment, int y, int color) { int startTime = getOffset(); int visibleTime = (int) (getZoom() * getLength()); diff --git a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java index 74a644ea..5ffc1110 100644 --- a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java +++ b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java @@ -34,6 +34,8 @@ import org.lwjgl.opengl.GL11; //$$ import net.minecraft.client.render.RenderLayer; //$$ import net.minecraft.client.render.VertexConsumer; //$$ import net.minecraft.client.render.VertexConsumerProvider; +//#else +import static com.replaymod.core.versions.MCVer.bindTexture; //#endif //#if MC>=12102 @@ -54,7 +56,6 @@ import java.util.Comparator; import java.util.Optional; import static com.replaymod.core.ReplayMod.TEXTURE; -import static com.replaymod.core.versions.MCVer.bindTexture; import static com.replaymod.core.versions.MCVer.emitLine; import static com.replaymod.core.versions.MCVer.popMatrix; import static com.replaymod.core.versions.MCVer.pushMatrix; @@ -310,7 +311,9 @@ public class PathPreviewRenderer extends EventRegistrations { private void drawPoint(Vector3f view, Vector3f pos, Keyframe keyframe) { + //#if MC<12105 bindTexture(TEXTURE); + //#endif float posX = 80f / ReplayMod.TEXTURE_SIZE; float posY = 0f; @@ -332,7 +335,11 @@ public class PathPreviewRenderer extends EventRegistrations { //#if MC>=12105 //$$ VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers(); //$$ immediate.draw(); + //#if MC>=12106 + //$$ VertexConsumer buffer = immediate.getBuffer(RenderLayer.getTextSeeThrough(TEXTURE)); + //#else //$$ VertexConsumer buffer = immediate.getBuffer(RenderLayer.getGuiTexturedOverlay(TEXTURE)); + //#endif //#else Tessellator tessellator = Tessellator.getInstance(); //#if MC>=12100 @@ -343,10 +350,10 @@ public class PathPreviewRenderer extends EventRegistrations { //#endif //#endif - buffer.vertex(minX, minY, 0).texture(posX + size, posY + size).color(255, 255, 255, 255).next(); - buffer.vertex(minX, maxY, 0).texture(posX + size, posY).color(255, 255, 255, 255).next(); - buffer.vertex(maxX, maxY, 0).texture(posX, posY).color(255, 255, 255, 255).next(); - buffer.vertex(maxX, minY, 0).texture(posX, posY + size).color(255, 255, 255, 255).next(); + vertex(buffer, minX, minY, 0, posX + size, posY + size, 255); + vertex(buffer, minX, maxY, 0, posX + size, posY, 255); + vertex(buffer, maxX, maxY, 0, posX, posY, 255); + vertex(buffer, maxX, minY, 0, posX, posY + size, 255); pushMatrix(); @@ -378,7 +385,9 @@ public class PathPreviewRenderer extends EventRegistrations { private void drawCamera(Vector3f view, Vector3f pos, Vector3f rot) { + //#if MC<12105 bindTexture(CAMERA_HEAD); + //#endif pushMatrix(); @@ -434,13 +443,11 @@ public class PathPreviewRenderer extends EventRegistrations { float cubeSize = 0.5f; - //#if MC>=12100 - //$$ float r = -cubeSize/2; - //#else - double r = -cubeSize/2; - //#endif + float r = -cubeSize/2; - //#if MC>=12105 + //#if MC>=12106 + //$$ buffer = immediate.getBuffer(RenderLayer.getText(CAMERA_HEAD)); + //#elseif MC>=12105 //$$ buffer = immediate.getBuffer(RenderLayer.getGuiTextured(CAMERA_HEAD)); //#elseif MC>=12100 //$$ buffer = tessellator.begin(net.minecraft.client.render.VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR); @@ -449,40 +456,40 @@ public class PathPreviewRenderer extends EventRegistrations { //#endif //back - buffer.vertex(r, r + cubeSize, r).texture(3 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r).texture(4*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r, r).texture(4*8/64f, 2*8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r).texture(3*8/64f, 2*8/64f).color(255, 255, 255, 200).next(); + vertex(buffer, r, r + cubeSize, r, 3 * 8 / 64f, 8 / 64f, 200); + vertex(buffer, r + cubeSize, r + cubeSize, r, 4*8/64f, 8/64f, 200); + vertex(buffer, r + cubeSize, r, r, 4*8/64f, 2*8/64f, 200); + vertex(buffer, r, r, r, 3*8/64f, 2*8/64f, 200); //front - buffer.vertex(r + cubeSize, r, r + cubeSize).texture(2 * 8 / 64f, 2*8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r + cubeSize).texture(2 * 8 / 64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r + cubeSize, r + cubeSize).texture(8 / 64f, 8 / 64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r + cubeSize).texture(8 / 64f, 2*8/64f).color(255, 255, 255, 200).next(); + vertex(buffer, r + cubeSize, r, r + cubeSize, 2 * 8 / 64f, 2*8/64f, 200); + vertex(buffer, r + cubeSize, r + cubeSize, r + cubeSize, 2 * 8 / 64f, 8/64f, 200); + vertex(buffer, r, r + cubeSize, r + cubeSize, 8 / 64f, 8 / 64f, 200); + vertex(buffer, r, r, r + cubeSize, 8 / 64f, 2*8/64f, 200); //left - buffer.vertex(r + cubeSize, r + cubeSize, r).texture(0, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r + cubeSize).texture(8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r, r + cubeSize).texture(8/64f, 2*8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r+cubeSize, r, r).texture(0, 2*8/64f).color(255, 255, 255, 200).next(); + vertex(buffer, r + cubeSize, r + cubeSize, r, 0, 8/64f, 200); + vertex(buffer, r + cubeSize, r + cubeSize, r + cubeSize, 8/64f, 8/64f, 200); + vertex(buffer, r + cubeSize, r, r + cubeSize, 8/64f, 2*8/64f, 200); + vertex(buffer, r+cubeSize, r, r, 0, 2*8/64f, 200); //right - buffer.vertex(r, r + cubeSize, r + cubeSize).texture(2*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r + cubeSize, r).texture(3*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r).texture(3*8/64f, 2*8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r + cubeSize).texture(2 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).next(); + vertex(buffer, r, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f, 200); + vertex(buffer, r, r + cubeSize, r, 3*8/64f, 8/64f, 200); + vertex(buffer, r, r, r, 3*8/64f, 2*8/64f, 200); + vertex(buffer, r, r, r + cubeSize, 2 * 8 / 64f, 2 * 8 / 64f, 200); //bottom - buffer.vertex(r + cubeSize, r, r).texture(3*8/64f, 0).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r, r + cubeSize).texture(3*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r + cubeSize).texture(2*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r, r, r).texture(2 * 8 / 64f, 0).color(255, 255, 255, 200).next(); + vertex(buffer, r + cubeSize, r, r, 3*8/64f, 0, 200); + vertex(buffer, r + cubeSize, r, r + cubeSize, 3*8/64f, 8/64f, 200); + vertex(buffer, r, r, r + cubeSize, 2*8/64f, 8/64f, 200); + vertex(buffer, r, r, r, 2 * 8 / 64f, 0, 200); //top - buffer.vertex(r, r + cubeSize, r).texture(8/64f, 0).color(255, 255, 255, 200).next(); - buffer.vertex(r, r + cubeSize, r + cubeSize).texture(8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r + cubeSize).texture(2*8/64f, 8/64f).color(255, 255, 255, 200).next(); - buffer.vertex(r + cubeSize, r + cubeSize, r).texture(2 * 8 / 64f, 0).color(255, 255, 255, 200).next(); + vertex(buffer, r, r + cubeSize, r, 8/64f, 0, 200); + vertex(buffer, r, r + cubeSize, r + cubeSize, 8/64f, 8/64f, 200); + vertex(buffer, r + cubeSize, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f, 200); + vertex(buffer, r + cubeSize, r + cubeSize, r, 2 * 8 / 64f, 0, 200); //#if MC>=12105 //$$ immediate.draw(); @@ -505,6 +512,18 @@ public class PathPreviewRenderer extends EventRegistrations { popMatrix(); } + //#if MC>=12105 + //$$ private void vertex(VertexConsumer buffer, float x, float y, float z, float u, float v, int alpha) { + //#else + private void vertex(BufferBuilder buffer, float x, float y, float z, float u, float v, int alpha) { + //#endif + //#if MC>=12106 + //$$ buffer.vertex(x, y, z).color(255, 255, 255, alpha).texture(u, v).light(240, 240); + //#else + buffer.vertex(x, y, z).texture(u, v).color(255, 255, 255, alpha).next(); + //#endif + } + private class KeyframeComparator implements Comparator> { private final Vector3f viewPos; diff --git a/src/main/resources/mixins.render.replaymod.json b/src/main/resources/mixins.render.replaymod.json index f4042846..5e1fb886 100644 --- a/src/main/resources/mixins.render.replaymod.json +++ b/src/main/resources/mixins.render.replaymod.json @@ -17,6 +17,9 @@ //#if MC>=12100 //$$ "Mixin_FakeSystemTimeUniforms_Iris", //#endif + //#if MC>=12105 + //$$ "Mixin_FixCopyTextureToBuffer_DepthTexture", + //#endif "Mixin_ForceChunkLoading", "Mixin_HideNameTags", "Mixin_HideNameTags_LivingEntity", diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index 83a26cf3..7310c105 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -35,6 +35,9 @@ //#else //$$ "EntityOtherPlayerMPAccessor", //#endif + //#if MC>=12106 + //$$ "DrawContextAccessor", + //#endif "EntityPlayerAccessor", "FirstPersonRendererAccessor", //#if MC>=10904 @@ -55,6 +58,7 @@ //#endif "MixinKeyboardListener", "MixinPlayerControllerMP", + "Mixin_CreateReplayCamera", "MixinRenderItem", "MixinRenderLivingBase", "MixinTileEntityEndPortalRenderer", diff --git a/version.txt b/version.txt index a534775a..fef250dd 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.6.22 +2.6.23 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 50b4c372..be2f6f38 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 @@ -100,7 +100,11 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { } // MC sometimes schedules invalid chunks when you're outside of loaded chunks (e.g. y > 256) if (builtChunk.shouldBuild()) { + //#if MC>=12106 + //$$ builtChunk.scheduleRebuild(chunkRendererRegionBuilder); + //#else builtChunk.scheduleRebuild(this.field_45614, chunkRendererRegionBuilder); + //#endif areWeDoneYet = false; } builtChunk.cancelRebuild(); diff --git a/versions/1.20.6/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerConfigClient.java b/versions/1.20.6/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerConfigClient.java index 58edc597..e065927d 100644 --- a/versions/1.20.6/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerConfigClient.java +++ b/versions/1.20.6/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerConfigClient.java @@ -15,6 +15,11 @@ import io.netty.buffer.Unpooled; import net.minecraft.client.network.ClientConfigurationNetworkHandler; import net.minecraft.nbt.NbtOps; import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.listener.ClientConfigurationPacketListener; +import net.minecraft.network.packet.BrandCustomPayload; +import net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.config.ReadyS2CPacket; +import net.minecraft.network.state.ConfigurationStates; import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; @@ -45,9 +50,12 @@ public abstract class MixinNetHandlerConfigClient { byteBuf.readBytes(bytes); byteBuf.release(); + int packetIdCustomPayload = getPacketId(new CustomPayloadS2CPacket(new BrandCustomPayload(""))); + int packetIdFinish = getPacketId(ReadyS2CPacket.INSTANCE); + PacketTypeRegistry registry = MCVer.getPacketTypeRegistry(State.CONFIGURATION); - packetListener.save(new Packet(registry, PacketType.ConfigCustomPayload, com.github.steveice10.netty.buffer.Unpooled.wrappedBuffer(bytes))); - packetListener.save(new Packet(registry, PacketType.ConfigFinish)); + packetListener.save(new Packet(registry, packetIdCustomPayload, PacketType.ConfigCustomPayload, com.github.steveice10.netty.buffer.Unpooled.wrappedBuffer(bytes))); + packetListener.save(new Packet(registry, packetIdFinish, PacketType.ConfigFinish, com.github.steveice10.netty.buffer.Unpooled.buffer())); } @Unique @@ -59,4 +67,19 @@ public abstract class MixinNetHandlerConfigClient { buf.writeNbt(codec.encodeStart(NbtOps.INSTANCE, entry.getValue()).getOrThrow()); } } + + @Unique + private int getPacketId(net.minecraft.network.packet.Packet packet) { + ByteBuf byteBuf = Unpooled.buffer(); + try { + //#if MC>=12106 + //$$ ConfigurationStates.S2C.comp_2236().encode(byteBuf, packet); + //#else + ConfigurationStates.S2C.codec().encode(byteBuf, packet); + //#endif + return new PacketByteBuf(byteBuf).readVarInt(); + } finally { + byteBuf.release(); + } + } } 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 new file mode 100644 index 00000000..98614570 --- /dev/null +++ b/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_FixCopyTextureToBuffer_DepthTexture.java @@ -0,0 +1,30 @@ +package com.replaymod.render.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +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) +public class Mixin_FixCopyTextureToBuffer_DepthTexture { + @WrapOperation( + method = "copyTextureToBuffer(Lcom/mojang/blaze3d/textures/GpuTexture;Lcom/mojang/blaze3d/buffers/GpuBuffer;ILjava/lang/Runnable;IIIII)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/FramebufferManager;setupFramebuffer(IIIII)V") + ) + private void setupFramebuffer( + FramebufferManager instance, + int framebuffer, int colorAttachment, int depthAttachment, int mipLevel, int bindTarget, + Operation original, + @Local(argsOnly = true) GpuTexture texture + ) { + if (depthAttachment == 0 && texture.getFormat().hasDepthAspect()) { + depthAttachment = colorAttachment; + colorAttachment = 0; + } + original.call(instance, framebuffer, colorAttachment, depthAttachment, mipLevel, bindTarget); + } +} diff --git a/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringGuiRendering.java b/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringGuiRendering.java new file mode 100644 index 00000000..4c96731b --- /dev/null +++ b/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringGuiRendering.java @@ -0,0 +1,22 @@ +package com.replaymod.render.mixin; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.mojang.blaze3d.systems.CommandEncoder; +import com.mojang.blaze3d.textures.GpuTexture; +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.GameRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(GameRenderer.class) +public abstract class Mixin_PreserveDepthDuringGuiRendering { + @WrapWithCondition( + method = "render", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/CommandEncoder;clearDepthTexture(Lcom/mojang/blaze3d/textures/GpuTexture;D)V") + ) + private boolean replayModRender_skipClearWhenRecordingDepth(CommandEncoder instance, GpuTexture texture, double v) { + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MinecraftClient.getInstance().gameRenderer).replayModRender_getHandler(); + return handler == null || !handler.getSettings().isDepthMap(); + } +} diff --git a/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringHandRendering.java b/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringHandRendering.java new file mode 100644 index 00000000..f8fec480 --- /dev/null +++ b/versions/1.21.5/src/main/java/com/replaymod/render/mixin/Mixin_PreserveDepthDuringHandRendering.java @@ -0,0 +1,21 @@ +package com.replaymod.render.mixin; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.mojang.blaze3d.systems.CommandEncoder; +import com.mojang.blaze3d.textures.GpuTexture; +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.render.GameRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(GameRenderer.class) +public abstract class Mixin_PreserveDepthDuringHandRendering { + @WrapWithCondition( + method = "renderWorld", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/CommandEncoder;clearDepthTexture(Lcom/mojang/blaze3d/textures/GpuTexture;D)V") + ) + private boolean replayModRender_skipClearWhenRecordingDepth(CommandEncoder instance, GpuTexture texture, double v) { + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) this).replayModRender_getHandler(); + return handler == null || !handler.getSettings().isDepthMap(); + } +} diff --git a/versions/1.21.7/.gitkeep b/versions/1.21.7/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/versions/1.21.7/gradle.properties b/versions/1.21.7/gradle.properties new file mode 100644 index 00000000..a38b4867 --- /dev/null +++ b/versions/1.21.7/gradle.properties @@ -0,0 +1,2 @@ +essential.defaults.loom.minecraft=com.mojang:minecraft:1.21.7 +essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.7+build.1 diff --git a/versions/1.21.7/src/main/java/com/replaymod/render/mixin/Mixin_ChromaKeyDisableFog.java b/versions/1.21.7/src/main/java/com/replaymod/render/mixin/Mixin_ChromaKeyDisableFog.java new file mode 100644 index 00000000..1638fc28 --- /dev/null +++ b/versions/1.21.7/src/main/java/com/replaymod/render/mixin/Mixin_ChromaKeyDisableFog.java @@ -0,0 +1,26 @@ +package com.replaymod.render.mixin; + +import com.replaymod.core.versions.MCVer; +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.fog.FogRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(FogRenderer.class) +public abstract class Mixin_ChromaKeyDisableFog { + @ModifyVariable(method = "getFogBuffer", at = @At("HEAD"), argsOnly = true) + private FogRenderer.FogType replayModRender_suppressFogIfChromaKeyIsActive(FogRenderer.FogType fogType) { + MinecraftClient mc = MCVer.getMinecraft(); + if (mc == null) return fogType; + GameRenderer gameRenderer = mc.gameRenderer; + if (gameRenderer == null) return fogType; + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) gameRenderer).replayModRender_getHandler(); + if (handler != null && handler.getSettings().getChromaKeyingColor() != null) { + fogType = FogRenderer.FogType.NONE; + } + return fogType; + } +} diff --git a/versions/1.21.7/src/main/java/com/replaymod/replay/mixin/DrawContextAccessor.java b/versions/1.21.7/src/main/java/com/replaymod/replay/mixin/DrawContextAccessor.java new file mode 100644 index 00000000..0ea5bef7 --- /dev/null +++ b/versions/1.21.7/src/main/java/com/replaymod/replay/mixin/DrawContextAccessor.java @@ -0,0 +1,12 @@ +package com.replaymod.replay.mixin; + +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.render.state.GuiRenderState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(DrawContext.class) +public interface DrawContextAccessor { + @Accessor + GuiRenderState getState(); +} diff --git a/versions/mapping-fabric-1.20.1-1.19.4.txt b/versions/mapping-fabric-1.20.1-1.19.4.txt index 47490df5..a4156302 100644 --- a/versions/mapping-fabric-1.20.1-1.19.4.txt +++ b/versions/mapping-fabric-1.20.1-1.19.4.txt @@ -3,3 +3,4 @@ net.irisshaders.iris.config.IrisConfig net.coderbot.iris.config.IrisConfig net.irisshaders.iris.gl.uniform.UniformHolder net.coderbot.iris.gl.uniform.UniformHolder net.irisshaders.iris.gl.uniform.UniformUpdateFrequency net.coderbot.iris.gl.uniform.UniformUpdateFrequency net.irisshaders.iris.uniforms.CommonUniforms net.coderbot.iris.uniforms.CommonUniforms +net.irisshaders.iris.pathways.HandRenderer net.coderbot.iris.pipeline.HandRenderer