Release 2.6.23

This commit is contained in:
Jonas Herzig
2025-07-05 09:40:33 +02:00
36 changed files with 630 additions and 155 deletions

View File

@@ -90,6 +90,7 @@ dependencies {
12102 -> "0.106.1+1.21.2" 12102 -> "0.106.1+1.21.2"
12104 -> "0.111.0+1.21.4" 12104 -> "0.111.0+1.21.4"
12105 -> "0.119.9+1.21.5" 12105 -> "0.119.9+1.21.5"
12107 -> "0.128.1+1.21.7"
else -> throw UnsupportedOperationException() else -> throw UnsupportedOperationException()
} }
val fabricApiModules = mutableListOf( val fabricApiModules = mutableListOf(
@@ -168,6 +169,7 @@ dependencies {
if (platform.isFabric) { if (platform.isFabric) {
val modMenuVersion = when { val modMenuVersion = when {
mcVersion >= 12107 -> "15.0.0-beta.3"
mcVersion >= 12105 -> "14.0.0-rc.2" mcVersion >= 12105 -> "14.0.0-rc.2"
mcVersion >= 12104 -> "13.0.0-beta.1" mcVersion >= 12104 -> "13.0.0-beta.1"
mcVersion >= 12102 -> "12.0.0-beta.1" mcVersion >= 12102 -> "12.0.0-beta.1"

View File

@@ -1,5 +1,5 @@
essential.defaults.loom=0 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. # 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: be4bf44276...31106f5dae

View File

@@ -204,6 +204,7 @@ defaultTasks("bundleJar")
preprocess { preprocess {
strictExtraMappings.set(true) strictExtraMappings.set(true)
val mc12107 = createNode("1.21.7", 12107, "yarn")
val mc12105 = createNode("1.21.5", 12105, "yarn") val mc12105 = createNode("1.21.5", 12105, "yarn")
val mc12104 = createNode("1.21.4", 12104, "yarn") val mc12104 = createNode("1.21.4", 12104, "yarn")
val mc12102 = createNode("1.21.2", 12102, "yarn") val mc12102 = createNode("1.21.2", 12102, "yarn")
@@ -236,6 +237,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")
mc12107.link(mc12105)
mc12105.link(mc12104, file("versions/mapping-fabric-1.21.5-1.21.4.txt")) mc12105.link(mc12104, file("versions/mapping-fabric-1.21.5-1.21.4.txt"))
mc12104.link(mc12102) mc12104.link(mc12102)
mc12102.link(mc12100) mc12102.link(mc12100)

View File

@@ -43,6 +43,7 @@ val jGuiVersions = listOf(
"1.21.2", "1.21.2",
"1.21.4", "1.21.4",
"1.21.5", "1.21.5",
"1.21.7",
) )
val replayModVersions = listOf( val replayModVersions = listOf(
// "1.7.10", // "1.7.10",
@@ -76,6 +77,7 @@ val replayModVersions = listOf(
"1.21.2", "1.21.2",
"1.21.4", "1.21.4",
"1.21.5", "1.21.5",
"1.21.7",
) )
rootProject.buildFileName = "root.gradle.kts" rootProject.buildFileName = "root.gradle.kts"

View File

@@ -21,7 +21,11 @@ public class ReplayModBackend implements ClientModInitializer {
} }
public String getMinecraftVersion() { public String getMinecraftVersion() {
//#if MC>=12106
//$$ return SharedConstants.getGameVersion().comp_4025();
//#else
return SharedConstants.getGameVersion().getName(); return SharedConstants.getGameVersion().getName();
//#endif
} }
public boolean isModLoaded(String id) { public boolean isModLoaded(String id) {

View File

@@ -2,32 +2,16 @@
package com.replaymod.core.mixin; package com.replaymod.core.mixin;
import com.replaymod.core.events.PreRenderHandCallback; import com.replaymod.core.events.PreRenderHandCallback;
import net.minecraft.client.render.Camera;
import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.util.math.MatrixStack;
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;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=12005
//$$ import org.joml.Matrix4f;
//#else
//#endif
@Mixin(GameRenderer.class) @Mixin(GameRenderer.class)
public class Mixin_PreRenderHandCallback { public class Mixin_PreRenderHandCallback {
@Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true)
private void preRenderHand( private void preRenderHand(CallbackInfo ci) {
//#if MC>=11500 && MC<12005
MatrixStack matrixStack,
//#endif
Camera camera,
float partialTicks,
//#if MC>=12005
//$$ Matrix4f matrixStack,
//#endif
CallbackInfo ci) {
if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) { if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) {
ci.cancel(); ci.cancel();
} }

View File

@@ -102,7 +102,9 @@ import java.util.Optional;
*/ */
public class MCVer { public class MCVer {
public static int getProtocolVersion() { public static int getProtocolVersion() {
//#if MC>=11400 //#if MC>=12106
//$$ return SharedConstants.getProtocolVersion();
//#elseif MC>=11400
return SharedConstants.getGameVersion().getProtocolVersion(); return SharedConstants.getGameVersion().getProtocolVersion();
//#else //#else
//$$ return RealmsSharedConstants.NETWORK_PROTOCOL_VERSION; //$$ return RealmsSharedConstants.NETWORK_PROTOCOL_VERSION;
@@ -488,9 +490,11 @@ public class MCVer {
buffer.next(); buffer.next();
} }
//#if MC<12105
public static void bindTexture(Identifier id) { public static void bindTexture(Identifier id) {
de.johni0702.minecraft.gui.versions.MCVer.bindTexture(id); de.johni0702.minecraft.gui.versions.MCVer.bindTexture(id);
} }
//#endif
//#if MC<10900 //#if MC<10900
//$$ public static class SoundEvent {} //$$ public static class SoundEvent {}

View File

@@ -35,7 +35,11 @@ public class SpectatorProperty extends AbstractProperty<Integer> {
ReplayHandler handler = ((ReplayHandler) replayHandler); ReplayHandler handler = ((ReplayHandler) replayHandler);
CameraEntity cameraEntity = handler.getCameraEntity(); CameraEntity cameraEntity = handler.getCameraEntity();
if (cameraEntity == null) return; if (cameraEntity == null) return;
//#if MC>=12106
//$$ World world = cameraEntity.getWorld();
//#else
World world = cameraEntity.getEntityWorld(); World world = cameraEntity.getEntityWorld();
//#endif
// Lookup entity by id, returns null if an entity with the id does not exists // Lookup entity by id, returns null if an entity with the id does not exists
Entity target = world.getEntityById(value); Entity target = world.getEntityById(value);
// Spectate entity, when called with null, returns to camera // Spectate entity, when called with null, returns to camera

View File

@@ -24,8 +24,10 @@ import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
//#if MC>=12105 //#if MC>=12105
//#if MC<12106
//$$ import com.mojang.blaze3d.buffers.BufferType; //$$ import com.mojang.blaze3d.buffers.BufferType;
//$$ import com.mojang.blaze3d.buffers.BufferUsage; //$$ import com.mojang.blaze3d.buffers.BufferUsage;
//#endif
//$$ import com.mojang.blaze3d.buffers.GpuBuffer; //$$ import com.mojang.blaze3d.buffers.GpuBuffer;
//$$ import com.mojang.blaze3d.systems.GpuDevice; //$$ import com.mojang.blaze3d.systems.GpuDevice;
//#endif //#endif
@@ -121,9 +123,17 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
ByteBuffer buffer = ByteBufferPool.allocate(getFrameWidth() * getFrameHeight() * 4); ByteBuffer buffer = ByteBufferPool.allocate(getFrameWidth() * getFrameHeight() * 4);
//#if MC>=12105 //#if MC>=12105
//$$ GpuDevice device = RenderSystem.getDevice(); //$$ 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)) { //$$ try (GpuBuffer gpuBuffer = device.createBuffer(null, BufferType.PIXEL_PACK, BufferUsage.STATIC_READ, getFrameWidth() * getFrameHeight() * 4)) {
//#endif
//$$ device.createCommandEncoder().copyTextureToBuffer(frameBuffer().getColorAttachment(), gpuBuffer, 0, () -> {}, 0); //$$ 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()); //$$ buffer.put(view.data());
//$$ } //$$ }
//$$ } //$$ }

View File

@@ -14,8 +14,10 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
//#if MC>=12105 //#if MC>=12105
//#if MC<12106
//$$ import com.mojang.blaze3d.buffers.BufferType; //$$ import com.mojang.blaze3d.buffers.BufferType;
//$$ import com.mojang.blaze3d.buffers.BufferUsage; //$$ import com.mojang.blaze3d.buffers.BufferUsage;
//#endif
//$$ import com.mojang.blaze3d.buffers.GpuBuffer; //$$ import com.mojang.blaze3d.buffers.GpuBuffer;
//$$ import com.mojang.blaze3d.systems.CommandEncoder; //$$ import com.mojang.blaze3d.systems.CommandEncoder;
//$$ import com.mojang.blaze3d.systems.GpuDevice; //$$ import com.mojang.blaze3d.systems.GpuDevice;
@@ -38,7 +40,10 @@ public abstract class PboOpenGlFrameCapturer<F extends Frame, D extends Enum<D>
withDepth = renderInfo.getRenderSettings().isDepthMap(); withDepth = renderInfo.getRenderSettings().isDepthMap();
data = type.getEnumConstants(); data = type.getEnumConstants();
int bufferSize = framePixels * (4 /* bgra */ + (withDepth ? 4 /* float */ : 0)) * data.length; 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); //$$ pbo = RenderSystem.getDevice().createBuffer(null, BufferType.PIXEL_PACK, BufferUsage.STREAM_READ, bufferSize);
//$$ otherPBO = RenderSystem.getDevice().createBuffer(null, BufferType.PIXEL_PACK, BufferUsage.STREAM_READ, bufferSize); //$$ otherPBO = RenderSystem.getDevice().createBuffer(null, BufferType.PIXEL_PACK, BufferUsage.STREAM_READ, bufferSize);
//#else //#else
@@ -97,7 +102,11 @@ public abstract class PboOpenGlFrameCapturer<F extends Frame, D extends Enum<D>
if (framesDone > 1) { if (framesDone > 1) {
// Read pbo to memory // Read pbo to memory
//#if MC>=12105 //#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)) { //$$ try (GpuBuffer.ReadView view = RenderSystem.getDevice().createCommandEncoder().readBuffer(pbo)) {
//#endif
//$$ channels = new HashMap<>(); //$$ channels = new HashMap<>();
//$$ channels.put(Channel.BRGA, readFromPbo(view.data(), 4, true)); //$$ channels.put(Channel.BRGA, readFromPbo(view.data(), 4, true));
//$$ if (withDepth) { //$$ if (withDepth) {

View File

@@ -88,12 +88,21 @@ 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
//$$ boolean orgRenderHand = mc.gameRenderer.isRenderingPanorama();
//#else
boolean orgRenderHand = gameRenderer.getRenderHand(); boolean orgRenderHand = gameRenderer.getRenderHand();
//#endif
try { try {
mc.currentScreen = null; // do not want to render the current screen (that'd just be the progress gui) 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 mc.options.pauseOnLostFocus = false; // do not want the pause menu to open if the window is unfocused
if (omnidirectional) { 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 //#if MC>=12100
@@ -111,7 +120,11 @@ 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>=12106
//$$ mc.gameRenderer.setRenderingPanorama(orgRenderHand);
//#else
gameRenderer.setRenderHand(orgRenderHand); gameRenderer.setRenderHand(orgRenderHand);
//#endif
} }
} }

View File

@@ -4,10 +4,30 @@ import net.minecraft.client.render.GameRenderer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; 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) @Mixin(GameRenderer.class)
public interface GameRendererAccessor { public interface GameRendererAccessor {
//#if MC<12106
@Accessor @Accessor
boolean getRenderHand(); boolean getRenderHand();
@Accessor @Accessor
void setRenderHand(boolean value); void setRenderHand(boolean value);
//#endif
//#if MC>=12106
//$$ @Accessor
//$$ Pool getPool();
//$$ @Accessor
//$$ GuiRenderer getGuiRenderer();
//$$ @Accessor
//$$ GuiRenderState getGuiState();
//$$ @Accessor
//$$ FogRenderer getFogRenderer();
//#endif
} }

View File

@@ -21,6 +21,12 @@ import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; 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 //#if MC>=12105
//$$ import org.spongepowered.asm.mixin.Mutable; //$$ import org.spongepowered.asm.mixin.Mutable;
//$$ import java.util.AbstractQueue; //$$ import java.util.AbstractQueue;
@@ -60,6 +66,13 @@ public abstract class Mixin_BlockOnChunkRebuilds implements ForceChunkLoadingHoo
//$$ runnable.run(); //$$ runnable.run();
//$$ anything = true; //$$ anything = true;
//$$ } //$$ }
//#if MC>=12106
//$$ AbstractChunkRenderData entry;
//$$ while ((entry = this.renderQueue.poll()) != null) {
//$$ entry.close();
//$$ anything = true;
//$$ }
//#endif
//$$ return anything; //$$ return anything;
//$$ } //$$ }
//#else //#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<AbstractChunkRenderData> renderQueue;
//$$ @Inject(method = "<init>", 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<AbstractChunkRenderData> 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<AbstractChunkRenderData> iterator() { return innerRenderQueue.iterator(); }
//$$ };
//$$ }
//#elseif MC>=12105
//$$ @Inject(method = "<init>", at = @At("RETURN")) //$$ @Inject(method = "<init>", at = @At("RETURN"))
//$$ private void notifyMainThreadOfNewUpload(CallbackInfo ci) { //$$ private void notifyMainThreadOfNewUpload(CallbackInfo ci) {
//$$ Queue<Runnable> inner = this.uploadQueue; //$$ Queue<Runnable> inner = this.uploadQueue;

View File

@@ -40,6 +40,14 @@ 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>=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 //#if MC>=12102
//$$ import com.mojang.blaze3d.systems.ProjectionType; //$$ import com.mojang.blaze3d.systems.ProjectionType;
//#endif //#endif
@@ -523,7 +531,8 @@ public class VideoRenderer implements RenderInfo {
RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC); RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC);
//#endif //#endif
//#endif //#endif
//#if MC>=11700 //#if MC>=12106
//#elseif MC>=11700
//$$ RenderSystem.setProjectionMatrix(Matrix4f.projectionMatrix( //$$ RenderSystem.setProjectionMatrix(Matrix4f.projectionMatrix(
//$$ 0, //$$ 0,
//$$ (float) (window.getFramebufferWidth() / window.getScaleFactor()), //$$ (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 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); 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()); //$$ DrawContext drawContext = new DrawContext(mc, mc.getBufferBuilders().getEntityVertexConsumers());
//#endif //#endif
@@ -611,15 +625,26 @@ public class VideoRenderer implements RenderInfo {
} }
} else { } else {
gui.toMinecraft().tick(); gui.toMinecraft().tick();
//#if MC>=12106
//$$ gui.toMinecraft().renderWithTooltip(
//#else
gui.toMinecraft().render( gui.toMinecraft().render(
//#endif
//#if MC>=12000 //#if MC>=12000
//$$ new DrawContext(mc, mc.getBufferBuilders().getEntityVertexConsumers()), //$$ drawContext,
//#elseif MC>=11600 //#elseif MC>=11600
new MatrixStack(), new MatrixStack(),
//#endif //#endif
mouseX, mouseY, 0); 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(); //$$ drawContext.draw();
//#endif //#endif
//#else //#else

View File

@@ -12,8 +12,10 @@ import static com.replaymod.core.versions.MCVer.popMatrix;
import static com.replaymod.core.versions.MCVer.pushMatrix; import static com.replaymod.core.versions.MCVer.pushMatrix;
//#if MC>=12105 //#if MC>=12105
//#if MC<12106
//$$ import com.mojang.blaze3d.buffers.BufferType; //$$ import com.mojang.blaze3d.buffers.BufferType;
//$$ import com.mojang.blaze3d.buffers.BufferUsage; //$$ import com.mojang.blaze3d.buffers.BufferUsage;
//#endif
//$$ import com.mojang.blaze3d.buffers.GpuBuffer; //$$ import com.mojang.blaze3d.buffers.GpuBuffer;
//$$ import com.mojang.blaze3d.systems.CommandEncoder; //$$ import com.mojang.blaze3d.systems.CommandEncoder;
//$$ import com.mojang.blaze3d.systems.GpuDevice; //$$ import com.mojang.blaze3d.systems.GpuDevice;
@@ -136,10 +138,18 @@ public class NoGuiScreenshot {
//#if MC>=12105 //#if MC>=12105
//$$ Image image; //$$ Image image;
//$$ GpuDevice device = RenderSystem.getDevice(); //$$ 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)) { //$$ try (GpuBuffer gpuBuffer = device.createBuffer(null, BufferType.PIXEL_PACK, BufferUsage.STATIC_READ, frameWidth * frameHeight * 4)) {
//#endif
//$$ CommandEncoder cmd = device.createCommandEncoder(); //$$ CommandEncoder cmd = device.createCommandEncoder();
//$$ cmd.copyTextureToBuffer(mc.getFramebuffer().getColorAttachment(), gpuBuffer, 0, () -> {}, 0); //$$ 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); //$$ NativeImage nativeImage = new NativeImage(frameWidth, frameHeight, false);
//$$ for (int y = 0; y < frameHeight; ++y) { //$$ for (int y = 0; y < frameHeight; ++y) {
//$$ for (int x = 0; x < frameWidth; ++x) { //$$ for (int x = 0; x < frameWidth; ++x) {

View File

@@ -45,6 +45,12 @@ import net.minecraft.network.ClientConnection;
import java.io.IOException; import java.io.IOException;
import java.util.*; 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 //#if MC>=12105
//$$ import net.minecraft.entity.PositionInterpolator; //$$ import net.minecraft.entity.PositionInterpolator;
//#endif //#endif
@@ -219,7 +225,9 @@ public class ReplayHandler {
//#endif //#endif
// Force re-creation of camera entity by unloading the previous world // Force re-creation of camera entity by unloading the previous world
//#if MC>=11400 //#if MC>=12106
//$$ mc.disconnectWithProgressScreen();
//#elseif MC>=11400
mc.disconnect(); mc.disconnect();
//#else //#else
//$$ // We need to re-set the GUI screen because having one with `allowsUserInput = true` active during world //$$ // 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.world != null) {
//#if MC>=11400 //#if MC>=12106
//$$ mc.disconnectWithProgressScreen();
//#elseif MC>=11400
mc.disconnect(); mc.disconnect();
//#else //#else
//$$ mc.world.sendQuittingDisconnectingPacket(); //$$ mc.world.sendQuittingDisconnectingPacket();
@@ -743,7 +753,8 @@ public class ReplayHandler {
RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC); RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC);
//#endif //#endif
//#endif //#endif
//#if MC>=11700 //#if MC>=12106
//#elseif MC>=11700
//$$ RenderSystem.setProjectionMatrix(Matrix4f.projectionMatrix( //$$ RenderSystem.setProjectionMatrix(Matrix4f.projectionMatrix(
//$$ 0, //$$ 0,
//$$ (float) (window.getFramebufferWidth() / window.getScaleFactor()), //$$ (float) (window.getFramebufferWidth() / window.getScaleFactor()),
@@ -787,7 +798,18 @@ public class ReplayHandler {
//#endif //#endif
guiScreen.toMinecraft().init(mc, window.getScaledWidth(), window.getScaledHeight()); 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()); //$$ DrawContext drawContext = new DrawContext(mc, mc.getBufferBuilders().getEntityVertexConsumers());
//$$ guiScreen.toMinecraft().render(drawContext, 0, 0, 0); //$$ guiScreen.toMinecraft().render(drawContext, 0, 0, 0);
//$$ drawContext.draw(); //$$ drawContext.draw();

View File

@@ -31,6 +31,10 @@ import net.minecraft.stat.StatHandler;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.Box; import net.minecraft.util.math.Box;
//#if MC>=12106
//$$ import net.minecraft.util.PlayerInput;
//#endif
//#if FABRIC>=1 //#if FABRIC>=1
//#else //#else
//$$ import net.minecraftforge.client.event.EntityViewRenderEvent; //$$ import net.minecraftforge.client.event.EntityViewRenderEvent;
@@ -164,7 +168,11 @@ public class CameraEntity
, recipeBook , recipeBook
//#endif //#endif
//#if MC>=11600 //#if MC>=11600
//#if MC>=12106
//$$ , PlayerInput.DEFAULT
//#else
, false , false
//#endif
, false , false
//#endif //#endif
); );

View File

@@ -1,39 +1,16 @@
package com.replaymod.replay.mixin; package com.replaymod.replay.mixin;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerInteractionManager; import net.minecraft.client.network.ClientPlayerInteractionManager;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 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 //#if MC>=10800
import net.minecraft.client.network.ClientPlayerEntity;
//#else //#else
//$$ import net.minecraft.client.entity.EntityClientPlayerMP;
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#endif //#endif
@@ -43,66 +20,6 @@ public abstract class MixinPlayerControllerMP {
@Shadow @Shadow
private MinecraftClient client; 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<ClientPlayerEntity> 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<EntityPlayerSP> 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<EntityPlayerSP> 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<EntityPlayerSP> 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<EntityClientPlayerMP> 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>=10800
//#if MC>=11400 //#if MC>=11400
@Inject(method = "isFlyingLocked", at=@At("HEAD"), cancellable = true) @Inject(method = "isFlyingLocked", at=@At("HEAD"), cancellable = true)
@@ -117,6 +34,9 @@ public abstract class MixinPlayerControllerMP {
//#endif //#endif
//#if MC<=10710 //#if MC<=10710
//$$ @Shadow
//$$ private NetHandlerPlayClient netClientHandler;
//$$
//$$ // Prevent the disconnect GUI from being opened during the short time when the replay is restarted //$$ // 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). //$$ // 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) //$$ @Inject(method = "updateController", at = @At("HEAD"), cancellable = true)

View File

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

View File

@@ -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.pushScissorState;
import static de.johni0702.minecraft.gui.versions.MCVer.setScissorDisabled; 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 //#if MC>=12105
//$$ import net.minecraft.client.render.RenderLayer; //$$ import net.minecraft.client.render.RenderLayer;
//$$ import net.minecraft.client.render.VertexConsumer; //$$ import net.minecraft.client.render.VertexConsumer;
@@ -116,6 +132,10 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
renderer.bindTexture(ReplayMod.TEXTURE); renderer.bindTexture(ReplayMod.TEXTURE);
//#if MC>=12106
//$$ TimeTimelineLinesRenderState linesRenderState = new TimeTimelineLinesRenderState();
//#endif
SPTimeline timeline = mod.getCurrentTimeline(); SPTimeline timeline = mod.getCurrentTimeline();
timeline.getTimeline().getPaths().stream().flatMap(path -> path.getKeyframes().stream()).forEach(keyframe -> { timeline.getTimeline().getPaths().stream().flatMap(path -> path.getKeyframes().stream()).forEach(keyframe -> {
@@ -188,6 +208,12 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
// And finally another vertical bit (the timeline is already crammed enough, so only the border) // And finally another vertical bit (the timeline is already crammed enough, so only the border)
Vector2f p4 = new Vector2f(keyframeTimelineLeft + positionXKeyframeTimeline, keyframeTimelineTop + BORDER_TOP); Vector2f p4 = new Vector2f(keyframeTimelineLeft + positionXKeyframeTimeline, keyframeTimelineTop + BORDER_TOP);
//#if MC>=12106
//$$ linesRenderState.color = color;
//$$ linesRenderState.line(p1, p2);
//$$ linesRenderState.line(p2, p3);
//$$ linesRenderState.line(p3, p4);
//#else
MatrixStack matrixStack = renderer.getMatrixStack(); MatrixStack matrixStack = renderer.getMatrixStack();
emitLine(matrixStack, buffer, p1, p2, color); emitLine(matrixStack, buffer, p1, p2, color);
emitLine(matrixStack, buffer, p2, p3, color); emitLine(matrixStack, buffer, p2, p3, color);
@@ -222,10 +248,31 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
//#endif //#endif
popScissorState(); popScissorState();
//#endif
} }
} }
}); });
//#if MC>=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 // Draw colored quads on spectator path segments
for (PathSegment segment : timeline.getPositionPath().getSegments()) { for (PathSegment segment : timeline.getPositionPath().getSegments()) {
if (segment.getInterpolator() == null if (segment.getInterpolator() == null
@@ -248,6 +295,65 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
super.drawTimelineCursor(renderer, size); super.drawTimelineCursor(renderer, size);
} }
//#if MC>=12106
//$$ private static class TimeTimelineLinesRenderState implements SpecialGuiElementRenderState {
//$$ int x1, x2, y1, y2;
//$$ ScreenRect scissorState;
//$$
//$$ List<Pair<Vector2f, Vector2f>> 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<TimeTimelineLinesRenderState> {
//$$ private static ClosableFactory<TimeTimelineLinesRenderer> 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<TimeTimelineLinesRenderState> 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<Vector2f, Vector2f> 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) { private void drawQuadOnSegment(GuiRenderer renderer, int visibleWidth, PathSegment segment, int y, int color) {
int startTime = getOffset(); int startTime = getOffset();
int visibleTime = (int) (getZoom() * getLength()); int visibleTime = (int) (getZoom() * getLength());

View File

@@ -34,6 +34,8 @@ import org.lwjgl.opengl.GL11;
//$$ import net.minecraft.client.render.RenderLayer; //$$ import net.minecraft.client.render.RenderLayer;
//$$ import net.minecraft.client.render.VertexConsumer; //$$ import net.minecraft.client.render.VertexConsumer;
//$$ import net.minecraft.client.render.VertexConsumerProvider; //$$ import net.minecraft.client.render.VertexConsumerProvider;
//#else
import static com.replaymod.core.versions.MCVer.bindTexture;
//#endif //#endif
//#if MC>=12102 //#if MC>=12102
@@ -54,7 +56,6 @@ import java.util.Comparator;
import java.util.Optional; import java.util.Optional;
import static com.replaymod.core.ReplayMod.TEXTURE; 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.emitLine;
import static com.replaymod.core.versions.MCVer.popMatrix; import static com.replaymod.core.versions.MCVer.popMatrix;
import static com.replaymod.core.versions.MCVer.pushMatrix; 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) { private void drawPoint(Vector3f view, Vector3f pos, Keyframe keyframe) {
//#if MC<12105
bindTexture(TEXTURE); bindTexture(TEXTURE);
//#endif
float posX = 80f / ReplayMod.TEXTURE_SIZE; float posX = 80f / ReplayMod.TEXTURE_SIZE;
float posY = 0f; float posY = 0f;
@@ -332,7 +335,11 @@ public class PathPreviewRenderer extends EventRegistrations {
//#if MC>=12105 //#if MC>=12105
//$$ VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers(); //$$ VertexConsumerProvider.Immediate immediate = mc.getBufferBuilders().getEntityVertexConsumers();
//$$ immediate.draw(); //$$ immediate.draw();
//#if MC>=12106
//$$ VertexConsumer buffer = immediate.getBuffer(RenderLayer.getTextSeeThrough(TEXTURE));
//#else
//$$ VertexConsumer buffer = immediate.getBuffer(RenderLayer.getGuiTexturedOverlay(TEXTURE)); //$$ VertexConsumer buffer = immediate.getBuffer(RenderLayer.getGuiTexturedOverlay(TEXTURE));
//#endif
//#else //#else
Tessellator tessellator = Tessellator.getInstance(); Tessellator tessellator = Tessellator.getInstance();
//#if MC>=12100 //#if MC>=12100
@@ -343,10 +350,10 @@ public class PathPreviewRenderer extends EventRegistrations {
//#endif //#endif
//#endif //#endif
buffer.vertex(minX, minY, 0).texture(posX + size, posY + size).color(255, 255, 255, 255).next(); vertex(buffer, minX, minY, 0, posX + size, posY + size, 255);
buffer.vertex(minX, maxY, 0).texture(posX + size, posY).color(255, 255, 255, 255).next(); vertex(buffer, minX, maxY, 0, posX + size, posY, 255);
buffer.vertex(maxX, maxY, 0).texture(posX, posY).color(255, 255, 255, 255).next(); vertex(buffer, maxX, maxY, 0, posX, posY, 255);
buffer.vertex(maxX, minY, 0).texture(posX, posY + size).color(255, 255, 255, 255).next(); vertex(buffer, maxX, minY, 0, posX, posY + size, 255);
pushMatrix(); pushMatrix();
@@ -378,7 +385,9 @@ public class PathPreviewRenderer extends EventRegistrations {
private void drawCamera(Vector3f view, Vector3f pos, Vector3f rot) { private void drawCamera(Vector3f view, Vector3f pos, Vector3f rot) {
//#if MC<12105
bindTexture(CAMERA_HEAD); bindTexture(CAMERA_HEAD);
//#endif
pushMatrix(); pushMatrix();
@@ -434,13 +443,11 @@ public class PathPreviewRenderer extends EventRegistrations {
float cubeSize = 0.5f; float cubeSize = 0.5f;
//#if MC>=12100 float r = -cubeSize/2;
//$$ float r = -cubeSize/2;
//#else
double r = -cubeSize/2;
//#endif
//#if MC>=12105 //#if MC>=12106
//$$ buffer = immediate.getBuffer(RenderLayer.getText(CAMERA_HEAD));
//#elseif MC>=12105
//$$ buffer = immediate.getBuffer(RenderLayer.getGuiTextured(CAMERA_HEAD)); //$$ buffer = immediate.getBuffer(RenderLayer.getGuiTextured(CAMERA_HEAD));
//#elseif MC>=12100 //#elseif MC>=12100
//$$ buffer = tessellator.begin(net.minecraft.client.render.VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR); //$$ buffer = tessellator.begin(net.minecraft.client.render.VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR);
@@ -449,40 +456,40 @@ public class PathPreviewRenderer extends EventRegistrations {
//#endif //#endif
//back //back
buffer.vertex(r, r + cubeSize, r).texture(3 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r + cubeSize, r, 3 * 8 / 64f, 8 / 64f, 200);
buffer.vertex(r + cubeSize, r + cubeSize, r).texture(4*8/64f, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r + cubeSize, r, 4*8/64f, 8/64f, 200);
buffer.vertex(r + cubeSize, r, r).texture(4*8/64f, 2*8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r, r, 4*8/64f, 2*8/64f, 200);
buffer.vertex(r, r, r).texture(3*8/64f, 2*8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r, r, 3*8/64f, 2*8/64f, 200);
//front //front
buffer.vertex(r + cubeSize, r, r + cubeSize).texture(2 * 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);
buffer.vertex(r + cubeSize, r + cubeSize, r + cubeSize).texture(2 * 8 / 64f, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r + cubeSize, r + cubeSize, 2 * 8 / 64f, 8/64f, 200);
buffer.vertex(r, r + cubeSize, r + cubeSize).texture(8 / 64f, 8 / 64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r + cubeSize, r + cubeSize, 8 / 64f, 8 / 64f, 200);
buffer.vertex(r, r, r + cubeSize).texture(8 / 64f, 2*8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r, r + cubeSize, 8 / 64f, 2*8/64f, 200);
//left //left
buffer.vertex(r + cubeSize, r + cubeSize, r).texture(0, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r + cubeSize, r, 0, 8/64f, 200);
buffer.vertex(r + cubeSize, r + cubeSize, r + cubeSize).texture(8/64f, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r + cubeSize, r + cubeSize, 8/64f, 8/64f, 200);
buffer.vertex(r + cubeSize, r, r + cubeSize).texture(8/64f, 2*8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r, r + cubeSize, 8/64f, 2*8/64f, 200);
buffer.vertex(r+cubeSize, r, r).texture(0, 2*8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r+cubeSize, r, r, 0, 2*8/64f, 200);
//right //right
buffer.vertex(r, r + cubeSize, r + cubeSize).texture(2*8/64f, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f, 200);
buffer.vertex(r, r + cubeSize, r).texture(3*8/64f, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r + cubeSize, r, 3*8/64f, 8/64f, 200);
buffer.vertex(r, r, r).texture(3*8/64f, 2*8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r, r, 3*8/64f, 2*8/64f, 200);
buffer.vertex(r, r, r + cubeSize).texture(2 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r, r + cubeSize, 2 * 8 / 64f, 2 * 8 / 64f, 200);
//bottom //bottom
buffer.vertex(r + cubeSize, r, r).texture(3*8/64f, 0).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r, r, 3*8/64f, 0, 200);
buffer.vertex(r + cubeSize, r, r + cubeSize).texture(3*8/64f, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r, r + cubeSize, 3*8/64f, 8/64f, 200);
buffer.vertex(r, r, r + cubeSize).texture(2*8/64f, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r, r + cubeSize, 2*8/64f, 8/64f, 200);
buffer.vertex(r, r, r).texture(2 * 8 / 64f, 0).color(255, 255, 255, 200).next(); vertex(buffer, r, r, r, 2 * 8 / 64f, 0, 200);
//top //top
buffer.vertex(r, r + cubeSize, r).texture(8/64f, 0).color(255, 255, 255, 200).next(); vertex(buffer, r, r + cubeSize, r, 8/64f, 0, 200);
buffer.vertex(r, r + cubeSize, r + cubeSize).texture(8/64f, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r, r + cubeSize, r + cubeSize, 8/64f, 8/64f, 200);
buffer.vertex(r + cubeSize, r + cubeSize, r + cubeSize).texture(2*8/64f, 8/64f).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f, 200);
buffer.vertex(r + cubeSize, r + cubeSize, r).texture(2 * 8 / 64f, 0).color(255, 255, 255, 200).next(); vertex(buffer, r + cubeSize, r + cubeSize, r, 2 * 8 / 64f, 0, 200);
//#if MC>=12105 //#if MC>=12105
//$$ immediate.draw(); //$$ immediate.draw();
@@ -505,6 +512,18 @@ public class PathPreviewRenderer extends EventRegistrations {
popMatrix(); 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<Pair<Keyframe, Vector3f>> { private class KeyframeComparator implements Comparator<Pair<Keyframe, Vector3f>> {
private final Vector3f viewPos; private final Vector3f viewPos;

View File

@@ -17,6 +17,9 @@
//#if MC>=12100 //#if MC>=12100
//$$ "Mixin_FakeSystemTimeUniforms_Iris", //$$ "Mixin_FakeSystemTimeUniforms_Iris",
//#endif //#endif
//#if MC>=12105
//$$ "Mixin_FixCopyTextureToBuffer_DepthTexture",
//#endif
"Mixin_ForceChunkLoading", "Mixin_ForceChunkLoading",
"Mixin_HideNameTags", "Mixin_HideNameTags",
"Mixin_HideNameTags_LivingEntity", "Mixin_HideNameTags_LivingEntity",

View File

@@ -35,6 +35,9 @@
//#else //#else
//$$ "EntityOtherPlayerMPAccessor", //$$ "EntityOtherPlayerMPAccessor",
//#endif //#endif
//#if MC>=12106
//$$ "DrawContextAccessor",
//#endif
"EntityPlayerAccessor", "EntityPlayerAccessor",
"FirstPersonRendererAccessor", "FirstPersonRendererAccessor",
//#if MC>=10904 //#if MC>=10904
@@ -55,6 +58,7 @@
//#endif //#endif
"MixinKeyboardListener", "MixinKeyboardListener",
"MixinPlayerControllerMP", "MixinPlayerControllerMP",
"Mixin_CreateReplayCamera",
"MixinRenderItem", "MixinRenderItem",
"MixinRenderLivingBase", "MixinRenderLivingBase",
"MixinTileEntityEndPortalRenderer", "MixinTileEntityEndPortalRenderer",

View File

@@ -1 +1 @@
2.6.22 2.6.23

View File

@@ -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) // MC sometimes schedules invalid chunks when you're outside of loaded chunks (e.g. y > 256)
if (builtChunk.shouldBuild()) { if (builtChunk.shouldBuild()) {
//#if MC>=12106
//$$ builtChunk.scheduleRebuild(chunkRendererRegionBuilder);
//#else
builtChunk.scheduleRebuild(this.field_45614, chunkRendererRegionBuilder); builtChunk.scheduleRebuild(this.field_45614, chunkRendererRegionBuilder);
//#endif
areWeDoneYet = false; areWeDoneYet = false;
} }
builtChunk.cancelRebuild(); builtChunk.cancelRebuild();

View File

@@ -15,6 +15,11 @@ import io.netty.buffer.Unpooled;
import net.minecraft.client.network.ClientConfigurationNetworkHandler; import net.minecraft.client.network.ClientConfigurationNetworkHandler;
import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtOps;
import net.minecraft.network.PacketByteBuf; 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.DynamicRegistryManager;
import net.minecraft.registry.Registry; import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKey;
@@ -45,9 +50,12 @@ public abstract class MixinNetHandlerConfigClient {
byteBuf.readBytes(bytes); byteBuf.readBytes(bytes);
byteBuf.release(); byteBuf.release();
int packetIdCustomPayload = getPacketId(new CustomPayloadS2CPacket(new BrandCustomPayload("")));
int packetIdFinish = getPacketId(ReadyS2CPacket.INSTANCE);
PacketTypeRegistry registry = MCVer.getPacketTypeRegistry(State.CONFIGURATION); 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, packetIdCustomPayload, PacketType.ConfigCustomPayload, com.github.steveice10.netty.buffer.Unpooled.wrappedBuffer(bytes)));
packetListener.save(new Packet(registry, PacketType.ConfigFinish)); packetListener.save(new Packet(registry, packetIdFinish, PacketType.ConfigFinish, com.github.steveice10.netty.buffer.Unpooled.buffer()));
} }
@Unique @Unique
@@ -59,4 +67,19 @@ public abstract class MixinNetHandlerConfigClient {
buf.writeNbt(codec.encodeStart(NbtOps.INSTANCE, entry.getValue()).getOrThrow()); buf.writeNbt(codec.encodeStart(NbtOps.INSTANCE, entry.getValue()).getOrThrow());
} }
} }
@Unique
private int getPacketId(net.minecraft.network.packet.Packet<? super ClientConfigurationPacketListener> 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();
}
}
} }

View File

@@ -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<Void> original,
@Local(argsOnly = true) GpuTexture texture
) {
if (depthAttachment == 0 && texture.getFormat().hasDepthAspect()) {
depthAttachment = colorAttachment;
colorAttachment = 0;
}
original.call(instance, framebuffer, colorAttachment, depthAttachment, mipLevel, bindTarget);
}
}

View File

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

View File

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

0
versions/1.21.7/.gitkeep Normal file
View File

View File

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

View File

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

View File

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

View File

@@ -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.UniformHolder net.coderbot.iris.gl.uniform.UniformHolder
net.irisshaders.iris.gl.uniform.UniformUpdateFrequency net.coderbot.iris.gl.uniform.UniformUpdateFrequency 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.uniforms.CommonUniforms net.coderbot.iris.uniforms.CommonUniforms
net.irisshaders.iris.pathways.HandRenderer net.coderbot.iris.pipeline.HandRenderer