WIP 1.15 and ReplayStudio v2 update

This commit is contained in:
Jonas Herzig
2020-03-13 14:18:19 +01:00
parent 8bc0b0a4df
commit af8803d6b5
65 changed files with 874 additions and 1303 deletions

View File

@@ -174,7 +174,8 @@ val doRelease by tasks.registering {
defaultTasks("shadowJar") defaultTasks("shadowJar")
preprocess { preprocess {
"1.14.4"(11404, "yarn") { "1.15.1"(11501, "yarn") {
"1.14.4"(11404, "yarn", file("versions/mapping-fabric-1.15.1-1.14.4.txt")) {
"1.14.4-forge"(11404, "srg", file("versions/mapping-1.14.4-fabric-forge.txt")) { "1.14.4-forge"(11404, "srg", file("versions/mapping-1.14.4-fabric-forge.txt")) {
"1.12.2"(11202, "srg", file("versions/1.14.4-forge/mapping.txt")) { "1.12.2"(11202, "srg", file("versions/1.14.4-forge/mapping.txt")) {
"1.12.1"(11201, "srg") { "1.12.1"(11201, "srg") {
@@ -197,4 +198,5 @@ preprocess {
} }
} }
} }
}
} }

2
jGui

Submodule jGui updated: 36fd2eb402...b434c78529

View File

@@ -26,7 +26,8 @@ val jGuiVersions = listOf(
"1.9.4", "1.9.4",
"1.12", "1.12",
"1.14.4-forge", "1.14.4-forge",
"1.14.4" "1.14.4",
"1.15.1"
) )
val replayModVersions = listOf( val replayModVersions = listOf(
"1.7.10", "1.7.10",
@@ -40,7 +41,8 @@ val replayModVersions = listOf(
"1.12.1", "1.12.1",
"1.12.2", "1.12.2",
"1.14.4-forge", "1.14.4-forge",
"1.14.4" "1.14.4",
"1.15.1"
) )
include(":jGui") include(":jGui")

View File

@@ -15,7 +15,9 @@ import com.replaymod.recording.ReplayModRecording;
import com.replaymod.render.ReplayModRender; import com.replaymod.render.ReplayModRender;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replaystudio.studio.ReplayStudio; import com.replaymod.replaystudio.studio.ReplayStudio;
import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersion;
import com.replaymod.replaystudio.util.I18n; import com.replaymod.replaystudio.util.I18n;
import com.replaymod.replaystudio.viaversion.ViaVersionPacketConverter;
import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.simplepathing.ReplayModSimplePathing;
import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.container.GuiScreen;
import lombok.Getter; import lombok.Getter;
@@ -30,8 +32,6 @@ import net.minecraft.util.Formatting;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
//#if MC>=11400 //#if MC>=11400
import com.github.steveice10.mc.protocol.MinecraftConstants;
import net.minecraft.SharedConstants;
import net.minecraft.client.options.Option; import net.minecraft.client.options.Option;
import net.minecraft.resource.ResourcePackCreator; import net.minecraft.resource.ResourcePackCreator;
import net.minecraft.resource.ResourcePackContainer; import net.minecraft.resource.ResourcePackContainer;
@@ -99,8 +99,6 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import static com.replaymod.core.versions.MCVer.*;
//#if FABRIC<=0 //#if FABRIC<=0
//#if MC>=11300 //#if MC>=11300
//$$ @Mod(ReplayMod.MOD_ID) //$$ @Mod(ReplayMod.MOD_ID)
@@ -180,19 +178,8 @@ public class ReplayMod implements
//#if MC>=11400 //#if MC>=11400
// Check Minecraft protocol version for compatibility // Check Minecraft protocol version for compatibility
int supportedProtocol = MinecraftConstants.PROTOCOL_VERSION; if (!ProtocolVersion.isRegistered(MCVer.getProtocolVersion()) && !Boolean.parseBoolean(System.getProperty("replaymod.skipversioncheck", "false"))) {
int actualProtocol = SharedConstants.getGameVersion().getProtocolVersion();
if (supportedProtocol != actualProtocol && !Boolean.parseBoolean(System.getProperty("replaymod.skipversioncheck", "false"))) {
minimalMode = true; minimalMode = true;
// Only allow use of older RM on newer (e.g. snapshot, pre-release) versions.
// The other way around is almost certainly user error.
if (actualProtocol < supportedProtocol && !Boolean.parseBoolean(System.getProperty("replaymod.allowoldsnapshot", "false"))) {
throw new UnsupportedOperationException(String.format(
"Unsupported Minecraft version, supporting protocol version %s (%s) but actual version is %s (%s).",
supportedProtocol, MinecraftConstants.GAME_VERSION,
actualProtocol, SharedConstants.getGameVersion().getName()
));
}
} }
//#endif //#endif
@@ -453,7 +440,10 @@ public class ReplayMod implements
public static class ReplayModExecutor extends NonBlockingThreadExecutor<Runnable> { public static class ReplayModExecutor extends NonBlockingThreadExecutor<Runnable> {
private final Thread mcThread = Thread.currentThread(); private final Thread mcThread = Thread.currentThread();
// Fail-fast in case we ever switch to async loading and forget to change this // Fail-fast in case we ever switch to async loading and forget to change this
// (except for fabric 1.15+ because it loads the mod before the client thread is set)
//#if FABRIC<1 || MC<11500
{ if (!MinecraftClient.getInstance().isOnThread()) throw new RuntimeException(); } { if (!MinecraftClient.getInstance().isOnThread()) throw new RuntimeException(); }
//#endif
private ReplayModExecutor(String string_1) { private ReplayModExecutor(String string_1) {
super(string_1); super(string_1);
@@ -474,7 +464,7 @@ public class ReplayMod implements
return mcThread; return mcThread;
} }
//#if FABRIC>=1 //#if FABRIC>=1 && MC<11500
@Override @Override
public void send(Runnable runnable) { public void send(Runnable runnable) {
method_18858(runnable); method_18858(runnable);
@@ -649,7 +639,7 @@ public class ReplayMod implements
if (isMinimalMode()) { if (isMinimalMode()) {
return protocolVersion == MCVer.getProtocolVersion(); return protocolVersion == MCVer.getProtocolVersion();
} else { } else {
return new ReplayStudio().isCompatible(fileFormatVersion, protocolVersion); return new ReplayStudio().isCompatible(fileFormatVersion, protocolVersion, MCVer.getProtocolVersion());
} }
} }
} }

View File

@@ -2,6 +2,7 @@ package com.replaymod.core.gui;
import com.google.common.io.Files; import com.google.common.io.Files;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.replaymod.core.versions.MCVer;
import com.replaymod.replaystudio.io.ReplayInputStream; import com.replaymod.replaystudio.io.ReplayInputStream;
import com.replaymod.replaystudio.io.ReplayOutputStream; import com.replaymod.replaystudio.io.ReplayOutputStream;
import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayFile;
@@ -56,8 +57,8 @@ public class RestoreReplayGui extends AbstractGuiScreen<RestoreReplayGui> {
if (metaData != null && metaData.getDuration() == 0) { if (metaData != null && metaData.getDuration() == 0) {
// Try to restore replay duration // Try to restore replay duration
// We need to re-write the packet data in case there are any incomplete packets dangling at the end // We need to re-write the packet data in case there are any incomplete packets dangling at the end
try (ReplayInputStream in = replayFile.getPacketData(studio, true); try (ReplayInputStream in = replayFile.getPacketData(MCVer.getPacketTypeRegistry(true));
ReplayOutputStream out = replayFile.writePacketData(true)) { ReplayOutputStream out = replayFile.writePacketData()) {
while (true) { while (true) {
// To prevent failing at un-parsable packets and to support recovery in minimal mode, // To prevent failing at un-parsable packets and to support recovery in minimal mode,
// we do not use the ReplayIn/OutputStream methods but instead parse the packets ourselves. // we do not use the ReplayIn/OutputStream methods but instead parse the packets ourselves.

View File

@@ -32,9 +32,6 @@ public interface MinecraftAccessor {
//$$ Queue<FutureTask<?>> getScheduledTasks(); //$$ Queue<FutureTask<?>> getScheduledTasks();
//#endif //#endif
@Accessor("crashed")
boolean hasCrashed();
@Accessor("crashReport") @Accessor("crashReport")
CrashReport getCrashReporter(); CrashReport getCrashReporter();

View File

@@ -10,6 +10,10 @@ 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>=11500
//$$ import net.minecraft.client.util.math.MatrixStack;
//#endif
@Mixin(GameRenderer.class) @Mixin(GameRenderer.class)
public class MixinGameRenderer { public class MixinGameRenderer {
@Inject( @Inject(
@@ -19,12 +23,24 @@ public class MixinGameRenderer {
target = "Lnet/minecraft/client/render/GameRenderer;renderHand:Z" target = "Lnet/minecraft/client/render/GameRenderer;renderHand:Z"
) )
) )
private void postRenderWorld(float partialTicks, long nanoTime, CallbackInfo ci) { private void postRenderWorld(
float partialTicks,
long nanoTime,
//#if MC>=11500
//$$ MatrixStack matrixStack,
//#endif
CallbackInfo ci) {
PostRenderWorldCallback.EVENT.invoker().postRenderWorld(); PostRenderWorldCallback.EVENT.invoker().postRenderWorld();
} }
@Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true)
private void preRenderHand(Camera camera, float partialTicks, CallbackInfo ci) { private void preRenderHand(
//#if MC>=11500
//$$ MatrixStack matrixStack,
//#endif
Camera camera,
float partialTicks,
CallbackInfo ci) {
if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) { if (PreRenderHandCallback.EVENT.invoker().preRenderHand()) {
ci.cancel(); ci.cancel();
} }

View File

@@ -1,11 +1,13 @@
package com.replaymod.core.utils; package com.replaymod.core.utils;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
import com.google.common.net.PercentEscaper; import com.google.common.net.PercentEscaper;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersion;
import de.johni0702.minecraft.gui.GuiRenderer; import de.johni0702.minecraft.gui.GuiRenderer;
import de.johni0702.minecraft.gui.RenderInfo; import de.johni0702.minecraft.gui.RenderInfo;
import de.johni0702.minecraft.gui.container.AbstractGuiScrollable; import de.johni0702.minecraft.gui.container.AbstractGuiScrollable;
@@ -37,11 +39,9 @@ import org.apache.logging.log4j.Logger;
//#endif //#endif
//#if MC>=10800 //#if MC>=10800
import com.github.steveice10.mc.protocol.MinecraftConstants;
import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.network.PlayerListEntry;
import net.minecraft.client.util.DefaultSkinHelper; import net.minecraft.client.util.DefaultSkinHelper;
//#else //#else
//$$ import com.github.steveice10.mc.protocol.ProtocolConstants;
//$$ import net.minecraft.client.Minecraft; //$$ import net.minecraft.client.Minecraft;
//$$ import net.minecraft.client.entity.AbstractClientPlayer; //$$ import net.minecraft.client.entity.AbstractClientPlayer;
//$$ import net.minecraft.entity.player.EntityPlayer; //$$ import net.minecraft.entity.player.EntityPlayer;
@@ -366,11 +366,9 @@ public class Utils {
new GuiLabel() new GuiLabel()
.setColor(Colors.BLACK) .setColor(Colors.BLACK)
.setI18nText("replaymod.gui.minimalmode.supportedversion", .setI18nText("replaymod.gui.minimalmode.supportedversion",
//#if MC>=10800 ProtocolVersion.v1_7_6.getName()
MinecraftConstants.GAME_VERSION + " - "
//#else + Iterables.getLast(ProtocolVersion.getProtocols()).getName()
//$$ ProtocolConstants.GAME_VERSION
//#endif
)); ));
open(); open();

View File

@@ -137,7 +137,15 @@ public class LangResourcePack extends AbstractFileResourcePack {
@Override @Override
public Collection<Identifier> findResources(ResourceType resourcePackType, String path, int maxDepth, Predicate<String> filter) { public Collection<Identifier> findResources(
ResourceType resourcePackType,
//#if MC>=11500
//$$ String namespace,
//#endif
String path,
int maxDepth,
Predicate<String> filter
) {
if (resourcePackType == ResourceType.CLIENT_RESOURCES && "lang".equals(path)) { if (resourcePackType == ResourceType.CLIENT_RESOURCES && "lang".equals(path)) {
Path base = baseLangPath(); Path base = baseLangPath();
//#if MC<11400 //#if MC<11400

View File

@@ -2,6 +2,9 @@ package com.replaymod.core.versions;
import com.replaymod.core.mixin.GuiScreenAccessor; import com.replaymod.core.mixin.GuiScreenAccessor;
import com.replaymod.core.mixin.MinecraftAccessor; import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.replaystudio.protocol.PacketTypeRegistry;
import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersion;
import com.replaymod.replaystudio.us.myles.ViaVersion.packets.State;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
@@ -27,6 +30,8 @@ import net.minecraft.SharedConstants;
import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.gui.screen.TitleScreen;
import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.AbstractButtonWidget; import net.minecraft.client.gui.widget.AbstractButtonWidget;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
//#else //#else
//$$ import com.google.common.util.concurrent.FutureCallback; //$$ import com.google.common.util.concurrent.FutureCallback;
@@ -76,7 +81,9 @@ import net.minecraft.client.render.BufferBuilder;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormatElement; import net.minecraft.client.render.VertexFormatElement;
//#if MC<11500
import net.minecraft.client.render.chunk.ChunkRenderTask; import net.minecraft.client.render.chunk.ChunkRenderTask;
//#endif
//#else //#else
//$$ import com.replaymod.core.mixin.ResourcePackRepositoryAccessor; //$$ import com.replaymod.core.mixin.ResourcePackRepositoryAccessor;
//$$ import com.google.common.util.concurrent.Futures; //$$ import com.google.common.util.concurrent.Futures;
@@ -134,10 +141,18 @@ public class MCVer {
//#if MC>=11400 //#if MC>=11400
return SharedConstants.getGameVersion().getProtocolVersion(); return SharedConstants.getGameVersion().getProtocolVersion();
//#else //#else
// FIXME
//$$ throw new UnsupportedOperationException("Minimal mode not supported pre-1.14"); //$$ throw new UnsupportedOperationException("Minimal mode not supported pre-1.14");
//#endif //#endif
} }
public static PacketTypeRegistry getPacketTypeRegistry(boolean loginPhase) {
return PacketTypeRegistry.get(
ProtocolVersion.getProtocol(getProtocolVersion()),
loginPhase ? State.LOGIN : State.PLAY
);
}
public static void addDetail(CrashReportSection category, String name, Callable<String> callable) { public static void addDetail(CrashReportSection category, String name, Callable<String> callable) {
//#if MC>=10904 //#if MC>=10904
//#if MC>=11200 //#if MC>=11200
@@ -150,6 +165,40 @@ public class MCVer {
//#endif //#endif
} }
public static double Entity_getX(Entity entity) {
//#if MC>=11500
//$$ return entity.getX();
//#else
return entity.x;
//#endif
}
public static double Entity_getY(Entity entity) {
//#if MC>=11500
//$$ return entity.getY();
//#else
return entity.y;
//#endif
}
public static double Entity_getZ(Entity entity) {
//#if MC>=11500
//$$ return entity.getZ();
//#else
return entity.z;
//#endif
}
public static void Entity_setPos(Entity entity, double x, double y, double z) {
//#if MC>=11500
//$$ entity.setPos(x, y, z);
//#else
entity.x = x;
entity.y = y;
entity.z = z;
//#endif
}
//#if MC>=11400 //#if MC>=11400
public static void width(AbstractButtonWidget button, int value) { public static void width(AbstractButtonWidget button, int value) {
button.setWidth(value); button.setWidth(value);
@@ -314,7 +363,11 @@ public class MCVer {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static List<Box> cubeList(Cuboid modelRenderer) { public static List<Box> cubeList(Cuboid modelRenderer) {
//#if MC>=11400
//$$ return new ArrayList<>(); // FIXME 1.15
//#else
return modelRenderer.boxes; return modelRenderer.boxes;
//#endif
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -335,8 +388,18 @@ public class MCVer {
} }
//#if MC>=11300 //#if MC>=11300
public static Window newScaledResolution(MinecraftClient mc) { public static Window getWindow(MinecraftClient mc) {
//#if MC>=11500
//$$ return mc.getWindow();
//#else
return mc.window; return mc.window;
//#endif
}
//#endif
//#if MC>=11300
public static Window newScaledResolution(MinecraftClient mc) {
return getWindow(mc);
} }
//#else //#else
//$$ public static ScaledResolution newScaledResolution(Minecraft mc) { //$$ public static ScaledResolution newScaledResolution(Minecraft mc) {
@@ -410,10 +473,6 @@ public class MCVer {
//$$ } //$$ }
//#endif //#endif
public static void BufferBuilder_setTranslation(double x, double y, double z) {
Tessellator_getBufferBuilder().setOffset(x, y, z);
}
public static void BufferBuilder_beginPosCol(int mode) { public static void BufferBuilder_beginPosCol(int mode) {
Tessellator_getBufferBuilder().begin( Tessellator_getBufferBuilder().begin(
mode mode
@@ -441,7 +500,7 @@ public class MCVer {
); );
} }
public static void BufferBuilder_addPosTex(double x, double y, double z, double u, double v) { public static void BufferBuilder_addPosTex(double x, double y, double z, float u, float v) {
//#if MC>=10809 //#if MC>=10809
Tessellator_getBufferBuilder().vertex(x, y, z).texture(u, v).next(); Tessellator_getBufferBuilder().vertex(x, y, z).texture(u, v).next();
//#else //#else
@@ -458,7 +517,7 @@ public class MCVer {
); );
} }
public static void BufferBuilder_addPosTexCol(double x, double y, double z, double u, double v, int r, int g, int b, int a) { public static void BufferBuilder_addPosTexCol(double x, double y, double z, float u, float v, int r, int g, int b, int a) {
//#if MC>=10809 //#if MC>=10809
Tessellator_getBufferBuilder().vertex(x, y, z).texture(u, v).color(r, g, b, a).next(); Tessellator_getBufferBuilder().vertex(x, y, z).texture(u, v).color(r, g, b, a).next();
//#else //#else
@@ -542,7 +601,7 @@ public class MCVer {
//#endif //#endif
} }
//#if MC>=10800 //#if MC>=10800 && MC<11500
public interface ChunkRenderWorkerAccessor { public interface ChunkRenderWorkerAccessor {
void doRunTask(ChunkRenderTask task) throws InterruptedException; void doRunTask(ChunkRenderTask task) throws InterruptedException;
} }
@@ -557,11 +616,15 @@ public class MCVer {
} }
public static void bindTexture(Identifier texture) { public static void bindTexture(Identifier texture) {
//#if MC>=11500
//$$ getMinecraft().getTextureManager().bindTexture(texture);
//#else
//#if MC>=11300 //#if MC>=11300
getMinecraft().getTextureManager().bindTexture(texture); getMinecraft().getTextureManager().bindTexture(texture);
//#else //#else
//$$ getMinecraft().renderEngine.bindTexture(texture); //$$ getMinecraft().renderEngine.bindTexture(texture);
//#endif //#endif
//#endif
} }
public static float cos(float val) { public static float cos(float val) {
@@ -751,6 +814,9 @@ public class MCVer {
//#endif //#endif
public static boolean isKeyDown(int keyCode) { public static boolean isKeyDown(int keyCode) {
//#if MC>=11500
//$$ return InputUtil.isKeyPressed(getMinecraft().getWindow().getHandle(), keyCode);
//#else
//#if MC>=11400 //#if MC>=11400
return InputUtil.isKeyPressed(getMinecraft().window.getHandle(), keyCode); return InputUtil.isKeyPressed(getMinecraft().window.getHandle(), keyCode);
//#else //#else
@@ -760,6 +826,7 @@ public class MCVer {
//$$ return org.lwjgl.input.Keyboard.isKeyDown(keyCode); //$$ return org.lwjgl.input.Keyboard.isKeyDown(keyCode);
//#endif //#endif
//#endif //#endif
//#endif
} }
//#if MC<11300 //#if MC<11300

View File

@@ -1,5 +1,6 @@
package com.replaymod.editor.gui; package com.replaymod.editor.gui;
import com.replaymod.core.versions.MCVer;
import com.replaymod.replaystudio.PacketData; import com.replaymod.replaystudio.PacketData;
import com.replaymod.replaystudio.Studio; import com.replaymod.replaystudio.Studio;
import com.replaymod.replaystudio.data.Marker; import com.replaymod.replaystudio.data.Marker;
@@ -7,6 +8,7 @@ import com.replaymod.replaystudio.filter.SquashFilter;
import com.replaymod.replaystudio.filter.StreamFilter; import com.replaymod.replaystudio.filter.StreamFilter;
import com.replaymod.replaystudio.io.ReplayInputStream; import com.replaymod.replaystudio.io.ReplayInputStream;
import com.replaymod.replaystudio.io.ReplayOutputStream; import com.replaymod.replaystudio.io.ReplayOutputStream;
import com.replaymod.replaystudio.protocol.PacketTypeRegistry;
import com.replaymod.replaystudio.replay.ReplayMetaData; import com.replaymod.replaystudio.replay.ReplayMetaData;
import com.replaymod.replaystudio.replay.ZipReplayFile; import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.stream.IteratorStream; import com.replaymod.replaystudio.stream.IteratorStream;
@@ -58,6 +60,7 @@ public class MarkerProcessor {
String replayName = FilenameUtils.getBaseName(path.getFileName().toString()); String replayName = FilenameUtils.getBaseName(path.getFileName().toString());
int splitCounter = 0; int splitCounter = 0;
PacketTypeRegistry registry = MCVer.getPacketTypeRegistry(true);
Studio studio = new ReplayStudio(); Studio studio = new ReplayStudio();
SquashFilter squashFilter = new SquashFilter(); SquashFilter squashFilter = new SquashFilter();
squashFilter.init(studio, null); squashFilter.init(studio, null);
@@ -73,7 +76,7 @@ public class MarkerProcessor {
boolean anySplit = markers.stream().anyMatch(m -> MARKER_NAME_SPLIT.equals(m.getName())); boolean anySplit = markers.stream().anyMatch(m -> MARKER_NAME_SPLIT.equals(m.getName()));
int inputDuration = inputReplayFile.getMetaData().getDuration(); int inputDuration = inputReplayFile.getMetaData().getDuration();
ReplayInputStream replayInputStream = inputReplayFile.getPacketData(studio, true); ReplayInputStream replayInputStream = inputReplayFile.getPacketData(registry);
int timeOffset = 0; int timeOffset = 0;
SquashFilter cutFilter = null; SquashFilter cutFilter = null;
int startCutOffset = 0; int startCutOffset = 0;
@@ -88,7 +91,7 @@ public class MarkerProcessor {
ReplayMetaData metaData = inputReplayFile.getMetaData(); ReplayMetaData metaData = inputReplayFile.getMetaData();
metaData.setDate(metaData.getDate() + timeOffset); metaData.setDate(metaData.getDate() + timeOffset);
try (ReplayOutputStream replayOutputStream = outputReplayFile.writePacketData(true)) { try (ReplayOutputStream replayOutputStream = outputReplayFile.writePacketData()) {
if (cutFilter != null) { if (cutFilter != null) {
cutFilter = squashFilter; cutFilter = squashFilter;
} else if (splitCounter > 0) { } else if (splitCounter > 0) {
@@ -153,7 +156,7 @@ public class MarkerProcessor {
} }
metaData.setDuration((int) duration); metaData.setDuration((int) duration);
outputReplayFile.writeMetaData(metaData); outputReplayFile.writeMetaData(registry, metaData);
outputReplayFile.writeMarkers(outputMarkers); outputReplayFile.writeMarkers(outputMarkers);

View File

@@ -13,9 +13,10 @@ import net.minecraft.util.crash.CrashReport;
//#if MC>=11300 //#if MC>=11300
import com.replaymod.render.mixin.MainWindowAccessor; import com.replaymod.render.mixin.MainWindowAccessor;
import static com.replaymod.core.versions.MCVer.getWindow;
//#endif //#endif
//#if MC>=10800 //#if MC>=10800 && MC<11500
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
//#endif //#endif
@@ -33,8 +34,8 @@ public class ScreenshotRenderer implements RenderInfo {
public boolean renderScreenshot() throws Throwable { public boolean renderScreenshot() throws Throwable {
try { try {
//#if MC>=11300 //#if MC>=11300
int displayWidthBefore = mc.window.getFramebufferWidth(); int displayWidthBefore = getWindow(mc).getFramebufferWidth();
int displayHeightBefore = mc.window.getFramebufferHeight(); int displayHeightBefore = getWindow(mc).getFramebufferHeight();
//#else //#else
//$$ int displayWidthBefore = mc.displayWidth; //$$ int displayWidthBefore = mc.displayWidth;
//$$ int displayHeightBefore = mc.displayHeight; //$$ int displayHeightBefore = mc.displayHeight;
@@ -43,7 +44,7 @@ public class ScreenshotRenderer implements RenderInfo {
boolean hideGUIBefore = mc.options.hudHidden; boolean hideGUIBefore = mc.options.hudHidden;
mc.options.hudHidden = true; mc.options.hudHidden = true;
//#if MC>=10800 //#if MC>=10800 && MC<11500
ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.worldRenderer); ChunkLoadingRenderGlobal clrg = new ChunkLoadingRenderGlobal(mc.worldRenderer);
//#endif //#endif
@@ -55,14 +56,14 @@ public class ScreenshotRenderer implements RenderInfo {
new ScreenshotWriter(settings.getOutputFile())).run(); new ScreenshotWriter(settings.getOutputFile())).run();
} }
//#if MC>=10800 //#if MC>=10800 && MC<11500
clrg.uninstall(); clrg.uninstall();
//#endif //#endif
mc.options.hudHidden = hideGUIBefore; mc.options.hudHidden = hideGUIBefore;
//#if MC>=11300 //#if MC>=11300
//noinspection ConstantConditions //noinspection ConstantConditions
MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.window; MainWindowAccessor acc = (MainWindowAccessor) (Object) getWindow(mc);
acc.setFramebufferWidth(displayWidthBefore); acc.setFramebufferWidth(displayWidthBefore);
acc.setFramebufferHeight(displayHeightBefore); acc.setFramebufferHeight(displayHeightBefore);
mc.getFramebuffer().resize(displayWidthBefore, displayHeightBefore mc.getFramebuffer().resize(displayWidthBefore, displayHeightBefore

View File

@@ -73,10 +73,17 @@ public abstract class UriScheme {
switch (SystemUtil.getOperatingSystem()) { switch (SystemUtil.getOperatingSystem()) {
case LINUX: case LINUX:
return new LinuxUriScheme(); return new LinuxUriScheme();
//#if MC>=11500
//$$ case WINDOWS:
//$$ return new WindowsUriScheme();
//$$ case OSX:
//$$ return new OSXUriScheme();
//#else
case field_1133: case field_1133:
return new WindowsUriScheme(); return new WindowsUriScheme();
case field_1137: case field_1137:
return new OSXUriScheme(); return new OSXUriScheme();
//#endif
case SOLARIS: case SOLARIS:
case UNKNOWN: case UNKNOWN:
default: default:

View File

@@ -201,7 +201,7 @@ public class GuiUploadReplay extends GuiScreen {
try (ReplayFile replay = new ZipReplayFile(new ReplayStudio(), file)) { try (ReplayFile replay = new ZipReplayFile(new ReplayStudio(), file)) {
ReplayMetaData newMetaData = new ReplayMetaData(metaData); ReplayMetaData newMetaData = new ReplayMetaData(metaData);
newMetaData.setServerName(null); newMetaData.setServerName(null);
replay.writeMetaData(newMetaData); replay.writeMetaData(null, newMetaData);
replay.saveTo(tmp); replay.saveTo(tmp);
} }

View File

@@ -152,9 +152,9 @@ public class RecordingEventHandler extends EventRegistrations {
boolean force = false; boolean force = false;
if(lastX == null || lastY == null || lastZ == null) { if(lastX == null || lastY == null || lastZ == null) {
force = true; force = true;
lastX = player.x; lastX = Entity_getX(player);
lastY = player.y; lastY = Entity_getY(player);
lastZ = player.z; lastZ = Entity_getZ(player);
} }
ticksSinceLastCorrection++; ticksSinceLastCorrection++;
@@ -163,13 +163,13 @@ public class RecordingEventHandler extends EventRegistrations {
force = true; force = true;
} }
double dx = player.x - lastX; double dx = Entity_getX(player) - lastX;
double dy = player.y - lastY; double dy = Entity_getY(player) - lastY;
double dz = player.z - lastZ; double dz = Entity_getZ(player) - lastZ;
lastX = player.x; lastX = Entity_getX(player);
lastY = player.y; lastY = Entity_getY(player);
lastZ = player.z; lastZ = Entity_getZ(player);
Packet packet; Packet packet;
if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) { if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) {

View File

@@ -12,8 +12,9 @@ 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>=10800 //#if MC>=10800
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPlayerListEntryPacket; import com.replaymod.replaystudio.protocol.Packet;
import com.github.steveice10.packetlib.io.buffer.ByteBufferNetInput; import com.replaymod.replaystudio.protocol.PacketType;
import com.replaymod.replaystudio.protocol.packets.PacketPlayerListEntry;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import net.minecraft.util.PacketByteBuf; import net.minecraft.util.PacketByteBuf;
@@ -21,7 +22,6 @@ import net.minecraft.client.network.packet.PlayerListS2CPacket;
import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.network.PlayerListEntry;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
//#else //#else
@@ -62,10 +62,9 @@ public abstract class MixinNetHandlerPlayClient {
RecordingEventHandler handler = getRecordingEventHandler(); RecordingEventHandler handler = getRecordingEventHandler();
if (handler != null && packet.getAction() == PlayerListS2CPacket.Action.ADD_PLAYER) { if (handler != null && packet.getAction() == PlayerListS2CPacket.Action.ADD_PLAYER) {
// We cannot reference SPacketPlayerListItem.AddPlayerData directly for complicated (and yet to be // We cannot reference SPacketPlayerListItem.AddPlayerData directly for complicated (and yet to be
// resolved) reasons (see https://github.com/MinecraftForge/ForgeGradle/issues/472), so we "simply" convert // resolved) reasons (see https://github.com/MinecraftForge/ForgeGradle/issues/472), so we use ReplayStudio
// the back to the MCProtocolLib equivalent and deal with that one. // to parse it instead.
ByteBuf byteBuf = Unpooled.buffer(); ByteBuf byteBuf = Unpooled.buffer();
ServerPlayerListEntryPacket mcpl = new ServerPlayerListEntryPacket(null, null);
try { try {
packet.write(new PacketByteBuf(byteBuf)); packet.write(new PacketByteBuf(byteBuf));
@@ -73,21 +72,22 @@ public abstract class MixinNetHandlerPlayClient {
byte[] array = new byte[byteBuf.readableBytes()]; byte[] array = new byte[byteBuf.readableBytes()];
byteBuf.readBytes(array); byteBuf.readBytes(array);
mcpl.read(new ByteBufferNetInput(ByteBuffer.wrap(array))); for (PacketPlayerListEntry data : PacketPlayerListEntry.read(new Packet(
MCVer.getPacketTypeRegistry(false), 0, PacketType.PlayerListEntry,
com.github.steveice10.netty.buffer.Unpooled.wrappedBuffer(array)
))) {
if (data.getUuid() == null) continue;
// Only add spawn packet for our own player and only if he isn't known yet
if (data.getUuid().equals(mcStatic.player.getGameProfile().getId())
&& !this.playerListEntries.containsKey(data.getUuid())) {
handler.onPlayerJoin();
}
}
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); // we just parsed this? throw new RuntimeException(e); // we just parsed this?
} finally { } finally {
byteBuf.release(); byteBuf.release();
} }
for (com.github.steveice10.mc.protocol.data.game.PlayerListEntry data : mcpl.getEntries()) {
if (data.getProfile() == null || data.getProfile().getId() == null) continue;
// Only add spawn packet for our own player and only if he isn't known yet
if (data.getProfile().getId().equals(mcStatic.player.getGameProfile().getId())
&& !this.playerListEntries.containsKey(data.getProfile().getId())) {
handler.onPlayerJoin();
}
}
} }
} }
//#else //#else

View File

@@ -7,8 +7,10 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(MobSpawnS2CPacket.class) @Mixin(MobSpawnS2CPacket.class)
public interface SPacketSpawnMobAccessor { public interface SPacketSpawnMobAccessor {
//#if MC<11500
@Accessor("dataTracker") @Accessor("dataTracker")
DataTracker getDataManager(); DataTracker getDataManager();
@Accessor("dataTracker") @Accessor("dataTracker")
void setDataManager(DataTracker value); void setDataManager(DataTracker value);
//#endif
} }

View File

@@ -7,8 +7,10 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(PlayerSpawnS2CPacket.class) @Mixin(PlayerSpawnS2CPacket.class)
public interface SPacketSpawnPlayerAccessor { public interface SPacketSpawnPlayerAccessor {
//#if MC<11500
@Accessor("dataTracker") @Accessor("dataTracker")
DataTracker getDataManager(); DataTracker getDataManager();
@Accessor("dataTracker") @Accessor("dataTracker")
void setDataManager(DataTracker value); void setDataManager(DataTracker value);
//#endif
} }

View File

@@ -114,7 +114,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
this.metaData = metaData; this.metaData = metaData;
this.resourcePackRecorder = new ResourcePackRecorder(replayFile); this.resourcePackRecorder = new ResourcePackRecorder(replayFile);
// Note: doesn't actually always include the login phase, see `connectionState` field instead. // Note: doesn't actually always include the login phase, see `connectionState` field instead.
this.packetOutputStream = new DataOutputStream(replayFile.writePacketData(true)); this.packetOutputStream = new DataOutputStream(replayFile.writePacketData());
this.startTime = metaData.getDate(); this.startTime = metaData.getDate();
saveMetaData(); saveMetaData();
@@ -139,7 +139,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
out.write(json.getBytes()); out.write(json.getBytes());
} }
} else { } else {
replayFile.writeMetaData(metaData); replayFile.writeMetaData(MCVer.getPacketTypeRegistry(true), metaData);
} }
} }
} catch (IOException e) { } catch (IOException e) {
@@ -325,6 +325,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private byte[] getPacketData(Packet packet) throws Exception { private byte[] getPacketData(Packet packet) throws Exception {
//#if MC<11500
if (packet instanceof MobSpawnS2CPacket) { if (packet instanceof MobSpawnS2CPacket) {
MobSpawnS2CPacket p = (MobSpawnS2CPacket) packet; MobSpawnS2CPacket p = (MobSpawnS2CPacket) packet;
SPacketSpawnMobAccessor pa = (SPacketSpawnMobAccessor) p; SPacketSpawnMobAccessor pa = (SPacketSpawnMobAccessor) p;
@@ -368,6 +369,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
} }
} }
} }
//#endif
//#if MC>=10800 //#if MC>=10800
Integer packetId = connectionState.getPacketId(NetworkSide.CLIENTBOUND, packet); Integer packetId = connectionState.getPacketId(NetworkSide.CLIENTBOUND, packet);
@@ -401,9 +403,9 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
marker.setName(name); marker.setName(name);
marker.setTime(timestamp); marker.setTime(timestamp);
if (view != null) { if (view != null) {
marker.setX(view.x); marker.setX(Entity_getX(view));
marker.setY(view.y); marker.setY(Entity_getY(view));
marker.setZ(view.z); marker.setZ(Entity_getZ(view));
marker.setYaw(view.yaw); marker.setYaw(view.yaw);
marker.setPitch(view.pitch); marker.setPitch(view.pitch);
} }

View File

@@ -174,7 +174,12 @@ public class RenderSettings {
private static String findFFmpeg() { private static String findFFmpeg() {
switch (SystemUtil.getOperatingSystem()) { switch (SystemUtil.getOperatingSystem()) {
// TODO not sure why remap fails to remap this (even when manually added to mappings)
//#if MC>=11500
//$$ case WINDOWS:
//#else
case field_1133: case field_1133:
//#endif
// Allow windows users to unpack the ffmpeg archive into a sub-folder of their .minecraft folder // Allow windows users to unpack the ffmpeg archive into a sub-folder of their .minecraft folder
File inDotMinecraft = new File(MCVer.getMinecraft().runDirectory, "ffmpeg/bin/ffmpeg.exe"); File inDotMinecraft = new File(MCVer.getMinecraft().runDirectory, "ffmpeg/bin/ffmpeg.exe");
if (inDotMinecraft.exists()) { if (inDotMinecraft.exists()) {
@@ -182,7 +187,12 @@ public class RenderSettings {
return inDotMinecraft.getAbsolutePath(); return inDotMinecraft.getAbsolutePath();
} }
break; break;
// TODO not sure why remap fails to remap this (even when manually added to mappings)
//#if MC>=11500
//$$ case OSX:
//#else
case field_1137: case field_1137:
//#endif
// The PATH doesn't seem to be set as expected on OSX, therefore we check some common locations ourselves // The PATH doesn't seem to be set as expected on OSX, therefore we check some common locations ourselves
for (String path : new String[]{"/usr/local/bin/ffmpeg", "/usr/bin/ffmpeg"}) { for (String path : new String[]{"/usr/local/bin/ffmpeg", "/usr/bin/ffmpeg"}) {
File file = new File(path); File file = new File(path);

View File

@@ -11,6 +11,10 @@ import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormatElement; import net.minecraft.client.render.VertexFormatElement;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
//#if MC>=11500
//$$ import com.mojang.datafixers.util.Pair;
//#endif
//#if MC>=10904 //#if MC>=10904
//#if MC>=11200 //#if MC>=11200
import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.BufferBuilder;
@@ -135,7 +139,12 @@ public class BlendMeshBuilder
//#else //#else
//$$ public static DMesh addBufferToMesh(WorldRenderer bufferBuilder, DMesh mesh, Vector3f vertOffset) { //$$ public static DMesh addBufferToMesh(WorldRenderer bufferBuilder, DMesh mesh, Vector3f vertOffset) {
//#endif //#endif
//#if MC>=11500
//$$ Pair<DrawArrayParameters, ByteBuffer> data = bufferBuilder.popData();
//$$ return addBufferToMesh(data.getSecond(), data.getFirst().getMode(), data.getFirst().getVertexFormat(), mesh, vertOffset);
//#else
return addBufferToMesh(bufferBuilder.getByteBuffer(), bufferBuilder.getDrawMode(), bufferBuilder.getVertexFormat(), mesh, vertOffset); return addBufferToMesh(bufferBuilder.getByteBuffer(), bufferBuilder.getDrawMode(), bufferBuilder.getVertexFormat(), mesh, vertOffset);
//#endif
} }
public static DMesh addBufferToMesh(ByteBuffer buffer, int mode, VertexFormat vertexFormat, DMesh mesh, ReadableVector3f vertOffset) { public static DMesh addBufferToMesh(ByteBuffer buffer, int mode, VertexFormat vertexFormat, DMesh mesh, ReadableVector3f vertOffset) {
@@ -158,12 +167,20 @@ public class BlendMeshBuilder
// Determine offset of vertex components // Determine offset of vertex components
int posOffset = -1, colorOffset = -1, uvOffset = -1; int posOffset = -1, colorOffset = -1, uvOffset = -1;
int index = 0; int index = 0;
//#if MC>=11500
int elementOffset = 0;
//#endif
for (VertexFormatElement element : getElements(vertexFormat)) { for (VertexFormatElement element : getElements(vertexFormat)) {
//#if MC>=11500
//$$ int offset = elementOffset;
//$$ elementOffset += element.getSize();
//#else
//#if MC>=10809 //#if MC>=10809
int offset = vertexFormat.getElementOffset(index); int offset = vertexFormat.getElementOffset(index);
//#else //#else
//$$ int offset = element.getOffset(); //$$ int offset = element.getOffset();
//#endif //#endif
//#endif
switch (element.getType()) { switch (element.getType()) {
case POSITION: case POSITION:
//#if MC>=11400 //#if MC>=11400

View File

@@ -3,7 +3,10 @@ package com.replaymod.render.blend;
import com.replaymod.render.blend.data.DScene; import com.replaymod.render.blend.data.DScene;
import com.replaymod.render.blend.data.Serializer; import com.replaymod.render.blend.data.Serializer;
//#if MC>=10800 //#if MC>=10800
// FIXME 1.15
//#if MC<11500
import com.replaymod.render.blend.exporters.ChunkExporter; import com.replaymod.render.blend.exporters.ChunkExporter;
//#endif
import com.replaymod.render.blend.exporters.EntityExporter; import com.replaymod.render.blend.exporters.EntityExporter;
import com.replaymod.render.blend.exporters.ItemExporter; import com.replaymod.render.blend.exporters.ItemExporter;
import com.replaymod.render.blend.exporters.ParticlesExporter; import com.replaymod.render.blend.exporters.ParticlesExporter;
@@ -53,7 +56,10 @@ public class BlendState implements Exporter {
//#if MC>=10800 //#if MC>=10800
RenderState renderState = new RenderState(this); RenderState renderState = new RenderState(this);
register(renderState); register(renderState);
// FIXME 1.15
//#if MC<11500
register(new ChunkExporter()); register(new ChunkExporter());
//#endif
register(new EntityExporter(renderState)); register(new EntityExporter(renderState));
register(new TileEntityExporter(renderState)); register(new TileEntityExporter(renderState));
register(new ParticlesExporter(renderState)); register(new ParticlesExporter(renderState));

View File

@@ -1,4 +1,5 @@
//#if MC>=10800 // FIXME 1.15
//#if MC>=10800 && MC<11500
package com.replaymod.render.blend.exporters; package com.replaymod.render.blend.exporters;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;

View File

@@ -124,6 +124,9 @@ public class ItemExporter implements Exporter {
//$$ ? stack.getItem().getColorFromItemStack(stack, quad.getTintIndex()) | 0xff000000 //$$ ? stack.getItem().getColorFromItemStack(stack, quad.getTintIndex()) | 0xff000000
//#endif //#endif
: 0xffffffff; : 0xffffffff;
//#if MC>=11500
//$$ // FIXME 1.15
//#else
//#if MC>=11400 //#if MC>=11400
buffer.putVertexData(quad.getVertexData()); buffer.putVertexData(quad.getVertexData());
buffer.setQuadColor(color); buffer.setQuadColor(color);
@@ -132,6 +135,7 @@ public class ItemExporter implements Exporter {
//#else //#else
//$$ LightUtil.renderQuadColor(buffer, quad, color); //$$ LightUtil.renderQuadColor(buffer, quad, color);
//#endif //#endif
//#endif
} }
} }

View File

@@ -67,7 +67,11 @@ public class ModelRendererExporter implements Exporter {
} }
if (object == null) { if (object == null) {
object = new ModelBasedDObject(model, scale); object = new ModelBasedDObject(model, scale);
//#if MC>=11500
//$$ object.id.name = "???"; // FIXME 1.15 can we somehow nicely derive this?
//#else
object.id.name = model.name; object.id.name = model.name;
//#endif
object.setParent(parent); object.setParent(parent);
} }
object.lastFrame = frame; object.lastFrame = frame;
@@ -78,7 +82,11 @@ public class ModelRendererExporter implements Exporter {
DMesh mesh = new DMesh(); DMesh mesh = new DMesh();
BlendMeshBuilder builder = new BlendMeshBuilder(mesh); BlendMeshBuilder builder = new BlendMeshBuilder(mesh);
for (Box box : cubeList(model)) { for (Box box : cubeList(model)) {
//#if MC>=11500
//$$ // FIXME 1.15
//#else
box.render(builder, scale); box.render(builder, scale);
//#endif
} }
builder.maybeFinishDrawing(); builder.maybeFinishDrawing();
return mesh; return mesh;

View File

@@ -113,9 +113,16 @@ public class ParticlesExporter implements Exporter {
// Instead of actually translating, we just add the translation on the current model-view-matrix. // Instead of actually translating, we just add the translation on the current model-view-matrix.
Matrix4f modelView = getGlModelViewMatrix(); Matrix4f modelView = getGlModelViewMatrix();
ParticleAccessor acc = (ParticleAccessor) particle; ParticleAccessor acc = (ParticleAccessor) particle;
double dx = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * renderPartialTicks - Particle.cameraX; double dx = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * renderPartialTicks;
double dy = acc.getPrevPosY() + (acc.getPosY() - acc.getPrevPosY()) * renderPartialTicks - Particle.cameraY; double dy = acc.getPrevPosY() + (acc.getPosY() - acc.getPrevPosY()) * renderPartialTicks;
double dz = acc.getPrevPosZ() + (acc.getPosZ() - acc.getPrevPosZ()) * renderPartialTicks - Particle.cameraZ; double dz = acc.getPrevPosZ() + (acc.getPosZ() - acc.getPrevPosZ()) * renderPartialTicks;
//#if MC>=11500
//$$ // FIXME 1.15 is this still required?
//#else
dx -= Particle.cameraX;
dy -= Particle.cameraY;
dz -= Particle.cameraZ;
//#endif
Vector3f offset = new Vector3f((float) dx, (float) dy, (float) dz); Vector3f offset = new Vector3f((float) dx, (float) dy, (float) dz);
Matrix4f.translate(offset, modelView, modelView); Matrix4f.translate(offset, modelView, modelView);
renderState.pushModelView(modelView); renderState.pushModelView(modelView);
@@ -173,7 +180,11 @@ public class ParticlesExporter implements Exporter {
//#else //#else
//$$ MCVer.getMinecraft().getRenderViewEntity(), //$$ MCVer.getMinecraft().getRenderViewEntity(),
//#endif //#endif
0, 1, 1, 0, 0, 0); 0
//#if MC<11500
, 1, 1, 0, 0, 0
//#endif
);
//#else //#else
//$$ particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0); //$$ particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0);
//#endif //#endif

View File

@@ -15,11 +15,15 @@ import org.spongepowered.asm.mixin.gen.Accessor;
//#endif //#endif
//#endif //#endif
public interface ContainerLocalRenderInformationAccessor { public interface ContainerLocalRenderInformationAccessor {
//#if MC>=11500
//$$ @Accessor("chunk")
//#else
//#if MC>=11400 //#if MC>=11400
@Accessor("renderer") @Accessor("renderer")
//#else //#else
//$$ @Accessor //$$ @Accessor
//#endif //#endif
//#endif
ChunkRenderer getRenderChunk(); ChunkRenderer getRenderChunk();
} }
//#endif //#endif

View File

@@ -1,4 +1,5 @@
//#if MC>=10800 // FIXME 1.15
//#if MC>=10800 && MC<11500
package com.replaymod.render.blend.mixin; package com.replaymod.render.blend.mixin;
import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.BlendState;

View File

@@ -1,4 +1,4 @@
//#if MC>=10800 //#if MC>=10800 && MC<11500
package com.replaymod.render.blend.mixin; package com.replaymod.render.blend.mixin;
import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.BlendState;

View File

@@ -1,4 +1,5 @@
//#if MC>=10800 // FIXME 1.15
//#if MC>=10800 && MC<11500
package com.replaymod.render.blend.mixin; package com.replaymod.render.blend.mixin;
import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.BlendState;

View File

@@ -9,6 +9,11 @@ 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;
//#if MC>=11500
//$$ import net.minecraft.client.render.VertexConsumerProvider;
//$$ import net.minecraft.client.util.math.MatrixStack;
//#endif
//#if MC>=10904 //#if MC>=10904
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#else //#else
@@ -19,6 +24,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class MixinRenderManager { public abstract class MixinRenderManager {
@Inject( @Inject(
//#if MC>=11500
//$$ method = "render",
//#else
//#if MC>=11400 //#if MC>=11400
method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V",
//#else //#else
@@ -28,9 +36,17 @@ public abstract class MixinRenderManager {
//$$ method = "doRenderEntity", //$$ method = "doRenderEntity",
//#endif //#endif
//#endif //#endif
//#endif
at = @At(value = "INVOKE", at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;DDDFF)V")) target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;DDDFF)V"))
public void preRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, boolean box, public void preRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks,
//#if MC>=11500
//$$ MatrixStack matrixStack,
//$$ VertexConsumerProvider vertexConsumerProvider,
//$$ int int_1,
//#else
boolean box,
//#endif
//#if MC>=10904 //#if MC>=10904
CallbackInfo ci) { CallbackInfo ci) {
//#else //#else
@@ -43,6 +59,9 @@ public abstract class MixinRenderManager {
} }
@Inject( @Inject(
//#if MC>=11500
//$$ method = "render",
//#else
//#if MC>=11400 //#if MC>=11400
method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V",
//#else //#else
@@ -52,10 +71,18 @@ public abstract class MixinRenderManager {
//$$ method = "doRenderEntity", //$$ method = "doRenderEntity",
//#endif //#endif
//#endif //#endif
//#endif
at = @At(value = "INVOKE", at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;DDDFF)V", target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;DDDFF)V",
shift = At.Shift.AFTER)) shift = At.Shift.AFTER))
public void postRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, boolean box, public void postRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks,
//#if MC>=11500
//$$ MatrixStack matrixStack,
//$$ VertexConsumerProvider vertexConsumerProvider,
//$$ int int_1,
//#else
boolean box,
//#endif
//#if MC>=10904 //#if MC>=10904
CallbackInfo ci) { CallbackInfo ci) {
//#else //#else

View File

@@ -1,4 +1,5 @@
//#if MC>=10800 // FIXME 1.15
//#if MC>=10800 && MC<11500
package com.replaymod.render.blend.mixin; package com.replaymod.render.blend.mixin;
import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.BlendState;

View File

@@ -1,4 +1,5 @@
//#if MC>=10800 // FIXME 1.15
//#if MC>=10800 && MC<11500
package com.replaymod.render.blend.mixin; package com.replaymod.render.blend.mixin;
import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.render.WorldRenderer;

View File

@@ -18,6 +18,7 @@ import java.nio.ByteBuffer;
//#if MC>=11300 //#if MC>=11300
import com.replaymod.render.mixin.MainWindowAccessor; import com.replaymod.render.mixin.MainWindowAccessor;
import static com.replaymod.core.versions.MCVer.getWindow;
//#endif //#endif
//#if MC>=10800 //#if MC>=10800
@@ -125,7 +126,7 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
); );
} }
//noinspection ConstantConditions //noinspection ConstantConditions
MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) mc.window; MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) getWindow(mc);
mainWindow.setFramebufferWidth(width); mainWindow.setFramebufferWidth(width);
mainWindow.setFramebufferHeight(height); mainWindow.setFramebufferHeight(height);
//#else //#else

View File

@@ -244,7 +244,7 @@ public class GuiVideoRenderer extends GuiScreen implements Tickable {
previewTextureDirty = false; previewTextureDirty = false;
} }
guiRenderer.bindTexture(previewTexture); guiRenderer.bindTexture(previewTexture.getGlId());
renderPreviewTexture(guiRenderer, size, videoWidth, videoHeight); renderPreviewTexture(guiRenderer, size, videoWidth, videoHeight);
} }

View File

@@ -1,4 +1,5 @@
//#if MC>=10800 // FIXME 1.15 chunk rendering has changed significantly, ignoring this feature for now
//#if MC>=10800 && MC<11500
package com.replaymod.render.hooks; package com.replaymod.render.hooks;
import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor; import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor;

View File

@@ -8,6 +8,10 @@ import com.replaymod.render.capturer.WorldRenderer;
import lombok.Getter; import lombok.Getter;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
//#if MC>=11500
//$$ import net.minecraft.client.util.math.MatrixStack;
//#endif
//#if MC>=11400 //#if MC>=11400
import com.replaymod.core.events.PostRenderCallback; import com.replaymod.core.events.PostRenderCallback;
import com.replaymod.core.events.PreRenderCallback; import com.replaymod.core.events.PreRenderCallback;
@@ -59,7 +63,13 @@ public class EntityRendererHandler implements WorldRenderer {
//#endif //#endif
if (mc.world != null && mc.player != null) { if (mc.world != null && mc.player != null) {
mc.gameRenderer.renderWorld(partialTicks, finishTimeNano); mc.gameRenderer.renderWorld(
partialTicks,
finishTimeNano
//#if MC>=11500
//$$ , new MatrixStack()
//#endif
);
} }
//#if MC>=11400 //#if MC>=11400

View File

@@ -1,4 +1,4 @@
//#if MC>=10800 //#if MC>=10800 && MC<11500
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import net.minecraft.client.render.chunk.ChunkBatcher; import net.minecraft.client.render.chunk.ChunkBatcher;

View File

@@ -1,12 +1,10 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.CubicOpenGlFrameCapturer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import org.lwjgl.opengl.GL11;
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;
@@ -134,51 +132,4 @@ public abstract class MixinCamera {
} }
} }
} }
//#if MC>=11400
@Inject(method = "update", at = @At("HEAD"))
//#else
//$$ @Inject(method = "orientCamera", at = @At("HEAD"))
//#endif
private void replayModRender_setupCubicFrameRotation(
//#if MC>=11400
BlockView blockView,
Entity entity,
boolean thirdPerson,
boolean inverseView,
//#endif
float partialTicks,
CallbackInfo ci
) {
if (getHandler() != null && getHandler().data instanceof CubicOpenGlFrameCapturer.Data) {
switch ((CubicOpenGlFrameCapturer.Data) getHandler().data) {
case FRONT:
GL11.glRotatef(0, 0.0F, 1.0F, 0.0F);
break;
case RIGHT:
GL11.glRotatef(90, 0.0F, 1.0F, 0.0F);
break;
case BACK:
GL11.glRotatef(180, 0.0F, 1.0F, 0.0F);
break;
case LEFT:
GL11.glRotatef(-90, 0.0F, 1.0F, 0.0F);
break;
case BOTTOM:
GL11.glRotatef(90, 1.0F, 0.0F, 0.0F);
break;
case TOP:
GL11.glRotatef(-90, 1.0F, 0.0F, 0.0F);
break;
}
}
if (getHandler() != null && getHandler().omnidirectional) {
// Minecraft goes back a little so we have to revert that
//#if MC>=11300
GL11.glTranslatef(0.0F, 0.0F, -0.05F);
//#else
//$$ GL11.glTranslatef(0.0F, 0.0F, 0.1F);
//#endif
}
}
} }

View File

@@ -1,6 +1,6 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
//#if MC>=10800 //#if MC>=10800 && MC<11500
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import net.minecraft.client.render.chunk.ChunkRenderTask; import net.minecraft.client.render.chunk.ChunkRenderTask;

View File

@@ -3,7 +3,6 @@ package com.replaymod.render.mixin;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
@@ -14,6 +13,11 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11500
//$$ import net.minecraft.client.util.math.MatrixStack;
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
//#endif
//#if MC>=11400 //#if MC>=11400
import net.minecraft.client.render.Camera; import net.minecraft.client.render.Camera;
import net.minecraft.util.hit.HitResult; import net.minecraft.util.hit.HitResult;
@@ -93,6 +97,9 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true)
private void replayModRender_renderSpectatorHand( private void replayModRender_renderSpectatorHand(
//#if MC>=11500
//$$ MatrixStack matrixStack,
//#endif
//#if MC>=11400 //#if MC>=11400
Camera camera, Camera camera,
//#endif //#endif
@@ -128,102 +135,27 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//$$ public abstract void renderHand(float partialTicks, int renderPass); //$$ public abstract void renderHand(float partialTicks, int renderPass);
//#endif //#endif
//#if MC>=11400
@Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;drawHighlightedBlockOutline(Lnet/minecraft/client/render/Camera;Lnet/minecraft/util/hit/HitResult;I)V"))
private void replayModRender_drawSelectionBox(WorldRenderer instance, Camera camera, HitResult hitResult, int something) {
if (replayModRender_handler == null) {
instance.drawHighlightedBlockOutline(camera, hitResult, something);
}
}
//#else
//#if MC>=11300
//$$ @Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V"))
//$$ private void replayModRender_drawSelectionBox(WorldRenderer instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) {
//#else
//#if MC>=10904
//$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V"))
//$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) {
//#else
//#if MC>=10800
//$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V"))
//#else
//$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V"))
//#endif
//$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition rtr, int alwaysZero, float partialTicks) {
//#endif
//#endif
//$$ if (replayModRender_handler == null) {
//$$ instance.drawSelectionBox(player, rtr, alwaysZero, partialTicks);
//$$ }
//$$ }
//#endif
private int orgRenderDistanceChunks;
//#if MC>=11300
//#if MC>=11400
@Inject(method = "renderCenter", at = @At(value = "JUMP", ordinal = 0))
//#else
//$$ @Inject(method = "updateCameraAndRender(FJ)V", at = @At(value = "JUMP", ordinal = 0))
//#endif
//#else
//#if MC>=10800
//$$ @Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0))
//#else
//$$ @Inject(method = "renderWorld", at = @At(value = "INVOKE", ordinal = 0, shift = At.Shift.AFTER,
//$$ target = "Lnet/minecraft/client/renderer/culling/ClippingHelperImpl;getInstance()Lnet/minecraft/client/renderer/culling/ClippingHelper;"))
//#endif
//#endif
private void replayModRender_beforeRenderSky(CallbackInfo ci) {
if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
GameOptions settings = MCVer.getMinecraft().options;
orgRenderDistanceChunks = settings.viewDistance;
settings.viewDistance = 5; // Set render distance to 5 so we're always rendering sky when chroma keying
}
}
//#if MC>=11300
//#if MC>=11400
@Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderSky(F)V"))
//#else
//$$ @Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;renderSky(F)V"))
//#endif
private void replayModRender_renderSky(WorldRenderer instance, float partialTicks) {
//#else
//#if MC>=10800
//$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(FI)V"))
//$$ private void replayModRender_renderSky(RenderGlobal instance, float partialTicks, int renderPass) {
//#else
//$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(F)V"))
//$$ private void replayModRender_renderSky(RenderGlobal instance, float partialTicks) {
//#endif
//#endif
if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
MCVer.getMinecraft().options.viewDistance = orgRenderDistanceChunks;
ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor();
GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1);
GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT
//#if MC>=11400
, false
//#endif
);
} else {
//#if MC>=11300
instance.renderSky(partialTicks);
//#else
//#if MC>=10800
//$$ instance.renderSky(partialTicks, renderPass);
//#else
//$$ instance.renderSky(partialTicks);
//#endif
//#endif
}
}
/* /*
* Stereoscopic Renderer * Stereoscopic Renderer
*/ */
//#if MC>=11500
//$$ @Inject(method = "method_22973", at = @At("RETURN"), cancellable = true)
//$$ private void replayModRender_setupStereoscopicProjection(CallbackInfoReturnable<Matrix4f> ci) {
//$$ if (replayModRender_getHandler() != null) {
//$$ Matrix4f offset;
//$$ if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) {
//$$ offset = Matrix4f.translate(0.07f, 0, 0);
//$$ } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) {
//$$ offset = Matrix4f.translate(-0.07f, 0, 0);
//$$ } else {
//$$ return;
//$$ }
//$$ offset.multiply(ci.getReturnValue());
//$$ ci.setReturnValue(offset);
//$$ }
//$$ }
//#else
//#if MC>=10800 //#if MC>=10800
@Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 0)) @Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 0))
//#else //#else
@@ -244,7 +176,20 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
} }
} }
} }
//#endif
//#if MC>=11500
//$$ @Inject(method = "renderWorld", at = @At("HEAD"))
//$$ private void replayModRender_setupStereoscopicProjection(float partialTicks, long frameStartNano, MatrixStack matrixStack, CallbackInfo ci) {
//$$ if (replayModRender_getHandler() != null) {
//$$ if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) {
//$$ matrixStack.translate(0.1, 0, 0);
//$$ } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) {
//$$ matrixStack.translate(-0.1, 0, 0);
//$$ }
//$$ }
//$$ }
//#else
//#if MC>=10800 //#if MC>=10800
@Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 1)) @Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 1))
//#else //#else
@@ -265,6 +210,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
} }
} }
} }
//#endif
/* /*
* Cubic Renderer * Cubic Renderer
@@ -276,6 +222,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
return replayModRender_perspective((float) fovY, aspect, zNear, zFar); return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
} }
//#if MC<11500
//#if MC>=11400 //#if MC>=11400
@Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;")) @Redirect(method = "renderCenter", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Matrix4f;method_4929(DFFF)Lnet/minecraft/client/util/math/Matrix4f;"))
//#else //#else
@@ -289,6 +236,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
private Matrix4f replayModRender_perspective$2(double fovY, float aspect, float zNear, float zFar) { private Matrix4f replayModRender_perspective$2(double fovY, float aspect, float zNear, float zFar) {
return replayModRender_perspective((float) fovY, aspect, zNear, zFar); return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
} }
//#endif
private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNear, float zFar) { private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNear, float zFar) {
if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {

View File

@@ -16,16 +16,11 @@ import net.minecraft.client.render.Camera;
@Mixin(BackgroundRenderer.class) @Mixin(BackgroundRenderer.class)
public abstract class MixinFogRenderer { public abstract class MixinFogRenderer {
@Inject(method = "applyFog", at = @At("HEAD"), cancellable = true) @Inject(method = "applyFog", at = @At("HEAD"), cancellable = true)
private void replayModRender_onSetupFog( private
//#if MC>=11400 //#if MC>=11500
Camera camera, //$$ static
int something,
//#else
//$$ int fogDistanceFlag,
//$$ float partialTicks,
//#endif //#endif
CallbackInfo ci void replayModRender_onSetupFog(CallbackInfo ci) {
) {
EntityRendererHandler handler = EntityRendererHandler handler =
((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler();
if (handler == null) return; if (handler == null) return;

View File

@@ -1,6 +1,7 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
//#if MC>=10904 // FIXME 1.15 seems like the way orientation is passed to particles has changed significantly
//#if MC>=10904 && MC<11500
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.exporters.ParticlesExporter; import com.replaymod.render.blend.exporters.ParticlesExporter;

View File

@@ -3,7 +3,6 @@ package com.replaymod.render.mixin;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.entity.Entity;
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;
@@ -11,12 +10,16 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(EntityRenderer.class) @Mixin(EntityRenderer.class)
public abstract class MixinRender { public abstract class MixinRender {
//#if MC>=11500
//$$ @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true)
//#else
//#if MC>=11400 //#if MC>=11400
@Inject(method = "renderLabel(Lnet/minecraft/entity/Entity;Ljava/lang/String;DDDI)V", at = @At("HEAD"), cancellable = true) @Inject(method = "renderLabel(Lnet/minecraft/entity/Entity;Ljava/lang/String;DDDI)V", at = @At("HEAD"), cancellable = true)
//#else //#else
//$$ @Inject(method = "renderLivingLabel", at = @At("HEAD"), cancellable = true) //$$ @Inject(method = "renderLivingLabel", at = @At("HEAD"), cancellable = true)
//#endif //#endif
private void replayModRender_areAllNamesHidden(Entity entityIn, String str, double x, double y, double z, int maxDistance, CallbackInfo ci) { //#endif
private void replayModRender_areAllNamesHidden(CallbackInfo ci) {
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler();
if (handler != null && !handler.getSettings().isRenderNameTags()) { if (handler != null && !handler.getSettings().isRenderNameTags()) {
ci.cancel(); ci.cancel();

View File

@@ -1,4 +1,4 @@
//#if MC>=10800 //#if MC>=10800 && MC<11500
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;

View File

@@ -9,6 +9,13 @@ 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;
//#if MC>=11500
//$$ import net.minecraft.client.render.VertexConsumerProvider;
//$$ import net.minecraft.client.util.math.MatrixStack;
//$$ import net.minecraft.client.util.math.Vector3f;
//$$ import net.minecraft.util.math.Quaternion;
//#endif
//#if MC>=10904 //#if MC>=10904
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#else //#else
@@ -17,12 +24,16 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(EntityRenderDispatcher.class) @Mixin(EntityRenderDispatcher.class)
public abstract class MixinRenderManager { public abstract class MixinRenderManager {
@Shadow //#if MC>=11500
private float cameraPitch; //$$ @Shadow private Quaternion rotation;
//#else
@Shadow @Shadow private float cameraPitch;
private float cameraYaw; @Shadow private float cameraYaw;
//#endif
//#if MC>=11400
//$$ @Inject(method = "render", at = @At("HEAD"))
//#else
//#if MC>=11400 //#if MC>=11400
@Inject(method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", at = @At("HEAD")) @Inject(method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", at = @At("HEAD"))
//#else //#else
@@ -32,8 +43,17 @@ public abstract class MixinRenderManager {
//$$ @Inject(method = "doRenderEntity", at = @At("HEAD")) //$$ @Inject(method = "doRenderEntity", at = @At("HEAD"))
//#endif //#endif
//#endif //#endif
//#endif
//#if MC>=10904 //#if MC>=10904
private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfo ci) { private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks,
//#if MC>=11500
//$$ MatrixStack matrixStack,
//$$ VertexConsumerProvider vertexConsumerProvider,
//$$ int int_1,
//#else
boolean iDoNotCare,
//#endif
CallbackInfo ci) {
//#else //#else
//$$ private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfoReturnable<Boolean> ci) { //$$ private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfoReturnable<Boolean> ci) {
//#endif //#endif
@@ -41,8 +61,14 @@ public abstract class MixinRenderManager {
if (handler != null && handler.omnidirectional) { if (handler != null && handler.omnidirectional) {
double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
double yaw = -Math.atan2(dx, dz); double yaw = -Math.atan2(dx, dz);
//#if MC>=11500
//$$ this.rotation = new Quaternion(0.0F, 0.0F, 0.0F, 1.0F);
//$$ this.rotation.hamiltonProduct(Vector3f.POSITIVE_Y.getDegreesQuaternion((float) -yaw));
//$$ this.rotation.hamiltonProduct(Vector3f.POSITIVE_X.getDegreesQuaternion((float) pitch));
//#else
this.cameraPitch = (float) Math.toDegrees(pitch); this.cameraPitch = (float) Math.toDegrees(pitch);
this.cameraYaw = (float) Math.toDegrees(yaw); this.cameraYaw = (float) Math.toDegrees(yaw);
//#endif
} }
} }
} }

View File

@@ -0,0 +1,39 @@
package com.replaymod.render.mixin;
import com.mojang.blaze3d.platform.GlStateManager;
import com.replaymod.render.hooks.EntityRendererHandler;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.WorldRenderer;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
/**
* Instead of rendering the normal sky, clears the screen with a uniform color for use with chroma keying.
*/
@Mixin(WorldRenderer.class)
public abstract class Mixin_ChromaKeyColorSky {
@Shadow @Final private MinecraftClient client;
@Inject(method = "renderSky", at = @At("HEAD"), cancellable = true)
private void chromaKeyingSky(CallbackInfo ci) {
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) client.gameRenderer).replayModRender_getHandler();
if (handler != null) {
ReadableColor color = handler.getSettings().getChromaKeyingColor();
if (color != null) {
GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1);
GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT
//#if MC>=11400
, false
//#endif
);
ci.cancel();
}
}
}
}

View File

@@ -0,0 +1,45 @@
package com.replaymod.render.mixin;
import com.replaymod.render.hooks.EntityRendererHandler;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor;
import net.minecraft.client.MinecraftClient;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.Constant;
import org.spongepowered.asm.mixin.injection.ModifyConstant;
//#if MC>=11500
//$$ import net.minecraft.client.render.WorldRenderer;
//#else
import net.minecraft.client.render.GameRenderer;
//#endif
/**
* Forces the sky to always render when chroma keying is active. Ordinarily it only renders when the render distance is
* at 4 or greater.
*/
//#if MC>=11500
//$$ @Mixin(WorldRenderer.class)
//#else
@Mixin(GameRenderer.class)
//#endif
public abstract class Mixin_ChromaKeyForceSky {
@Shadow @Final private MinecraftClient client;
//#if MC>=11500
//$$ @ModifyConstant(method = "render", constant = @Constant(intValue = 4))
//#else
@ModifyConstant(method = "renderCenter", constant = @Constant(intValue = 4))
//#endif
private int forceSkyWhenChromaKeying(int value) {
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) client.gameRenderer).replayModRender_getHandler();
if (handler != null) {
ReadableColor color = handler.getSettings().getChromaKeyingColor();
if (color != null) {
return 0;
}
}
return value;
}
}

View File

@@ -0,0 +1,98 @@
package com.replaymod.render.mixin;
import com.replaymod.render.capturer.CubicOpenGlFrameCapturer;
import com.replaymod.render.hooks.EntityRendererHandler;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11500
//$$ import net.minecraft.client.util.math.MatrixStack;
//$$ import net.minecraft.client.util.math.Vector3f;
//#else
import org.lwjgl.opengl.GL11;
//#endif
import static com.replaymod.core.versions.MCVer.getMinecraft;
//#if MC>=11500
//$$ @Mixin(value = net.minecraft.client.render.GameRenderer.class)
//#else
//#if MC>=11400
@Mixin(value = net.minecraft.client.render.Camera.class)
//#else
//$$ @Mixin(value = net.minecraft.client.renderer.EntityRenderer.class)
//#endif
//#endif
public abstract class Mixin_CubicRotation {
private EntityRendererHandler getHandler() {
return ((EntityRendererHandler.IEntityRenderer) getMinecraft().gameRenderer).replayModRender_getHandler();
}
//#if MC>=11500
//$$ @Inject(method = "renderWorld", at = @At("HEAD"))
//#else
//#if MC>=11400
@Inject(method = "update", at = @At("HEAD"))
//#else
//$$ @Inject(method = "orientCamera", at = @At("HEAD"))
//#endif
//#endif
private void replayModRender_setupCubicFrameRotation(
//#if MC>=11500
//$$ float partialTicks,
//$$ long frameStartNano,
//$$ MatrixStack matrixStack,
//#endif
CallbackInfo ci
) {
if (getHandler() != null && getHandler().data instanceof CubicOpenGlFrameCapturer.Data) {
CubicOpenGlFrameCapturer.Data data = (CubicOpenGlFrameCapturer.Data) getHandler().data;
float angle = 0;
float x = 0;
float y = 0;
switch (data) {
case FRONT:
angle = 0;
x = 1;
break;
case RIGHT:
angle = 90;
x = 1;
break;
case BACK:
angle = 180;
x = 1;
break;
case LEFT:
angle = -90;
x = 1;
break;
case TOP:
angle = -90;
y = 1;
break;
case BOTTOM:
angle = 90;
y = 1;
break;
}
//#if MC>=11400
//$$ matrixStack.multiply(new Vector3f(x, y, 0).getDegreesQuaternion(angle));
//#else
GL11.glRotatef(angle, x, y, 0);
//#endif
}
//#if MC<11500
if (getHandler() != null && getHandler().omnidirectional) {
// Minecraft goes back a little so we have to revert that
//#if MC>=11300
GL11.glTranslatef(0.0F, 0.0F, -0.05F);
//#else
//$$ GL11.glTranslatef(0.0F, 0.0F, 0.1F);
//#endif
}
//#endif
}
}

View File

@@ -0,0 +1,23 @@
package com.replaymod.render.mixin;
import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.WorldRenderer;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(WorldRenderer.class)
public abstract class Mixin_SkipBlockOutlinesDuringRender {
@Shadow @Final private MinecraftClient client;
@Inject(method = "drawHighlightedBlockOutline", at = @At("HEAD"), cancellable = true)
private void replayModRender_drawSelectionBox(CallbackInfo ci) {
if (((EntityRendererHandler.IEntityRenderer) client.gameRenderer).replayModRender_getHandler() != null) {
ci.cancel();
}
}
}

View File

@@ -13,6 +13,7 @@ import net.minecraft.client.render.chunk.ChunkRenderer;
@Mixin(WorldRenderer.class) @Mixin(WorldRenderer.class)
public interface WorldRendererAccessor { public interface WorldRendererAccessor {
//#if MC<11500
@Accessor("field_4076") @Accessor("field_4076")
void setRenderEntitiesStartupCounter(int value); void setRenderEntitiesStartupCounter(int value);
@@ -26,4 +27,5 @@ public interface WorldRendererAccessor {
@Accessor("chunkRenderers") @Accessor("chunkRenderers")
Set<ChunkRenderer> getChunksToUpdate(); Set<ChunkRenderer> getChunksToUpdate();
//#endif //#endif
//#endif
} }

View File

@@ -18,6 +18,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static com.replaymod.core.versions.MCVer.getWindow;
public class Pipeline<R extends Frame, P extends Frame> implements Runnable { public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
private final FrameCapturer<R> capturer; private final FrameCapturer<R> capturer;
@@ -58,9 +60,9 @@ public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
MinecraftClient mc = MCVer.getMinecraft(); MinecraftClient mc = MCVer.getMinecraft();
while (!capturer.isDone() && !Thread.currentThread().isInterrupted()) { while (!capturer.isDone() && !Thread.currentThread().isInterrupted()) {
//#if MC>=11300 //#if MC>=11300
if (GLFW.glfwWindowShouldClose(mc.window.getHandle()) || ((MinecraftAccessor) mc).hasCrashed()) { if (GLFW.glfwWindowShouldClose(getWindow(mc).getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) {
//#else //#else
//$$ if (Display.isCloseRequested() || ((MinecraftAccessor) mc).hasCrashed()) { //$$ if (Display.isCloseRequested() || ((MinecraftAccessor) mc).getCrashReporter() != null) {
//#endif //#endif
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
return; return;

View File

@@ -32,6 +32,12 @@ import net.minecraft.util.crash.CrashException;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.client.render.RenderTickCounter; import net.minecraft.client.render.RenderTickCounter;
//#if MC>=11500
//$$ import com.mojang.blaze3d.systems.RenderSystem;
//$$ import net.minecraft.client.util.Window;
//$$ import org.lwjgl.opengl.GL11;
//#endif
//#if MC>=11300 //#if MC>=11300
import com.replaymod.render.mixin.MainWindowAccessor; import com.replaymod.render.mixin.MainWindowAccessor;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
@@ -43,7 +49,9 @@ import org.lwjgl.glfw.GLFW;
//#endif //#endif
//#if MC>=10800 //#if MC>=10800
//#if MC<11500
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
//#endif
import static com.mojang.blaze3d.platform.GlStateManager.*; import static com.mojang.blaze3d.platform.GlStateManager.*;
//#else //#else
//$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay; //$$ import com.replaymod.replay.gui.screen.GuiOpeningReplay;
@@ -60,6 +68,7 @@ import java.util.concurrent.Future;
import java.util.concurrent.FutureTask; import java.util.concurrent.FutureTask;
import static com.google.common.collect.Iterables.getLast; import static com.google.common.collect.Iterables.getLast;
import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.render.ReplayModRender.LOGGER; import static com.replaymod.render.ReplayModRender.LOGGER;
import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; 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;
@@ -79,7 +88,7 @@ public class VideoRenderer implements RenderInfo {
private TimelinePlayer timelinePlayer; private TimelinePlayer timelinePlayer;
private Future<Void> timelinePlayerFuture; private Future<Void> timelinePlayerFuture;
//#if MC>=10800 //#if MC>=10800 && MC<11500
private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal; private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal;
//#endif //#endif
//#if MC<10800 //#if MC<10800
@@ -161,11 +170,13 @@ public class VideoRenderer implements RenderInfo {
} }
} }
//#if MC<11500
((WorldRendererAccessor) mc.worldRenderer).setRenderEntitiesStartupCounter(0); ((WorldRendererAccessor) mc.worldRenderer).setRenderEntitiesStartupCounter(0);
//#endif
renderingPipeline.run(); renderingPipeline.run();
if (((MinecraftAccessor) mc).hasCrashed()) { if (((MinecraftAccessor) mc).getCrashReporter() != null) {
throw new CrashException(((MinecraftAccessor) mc).getCrashReporter()); throw new CrashException(((MinecraftAccessor) mc).getCrashReporter());
} }
@@ -190,10 +201,10 @@ public class VideoRenderer implements RenderInfo {
public float updateForNextFrame() { public float updateForNextFrame() {
// because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily // because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily
//#if MC>=11300 //#if MC>=11300
int displayWidthBefore = mc.window.getFramebufferWidth(); int displayWidthBefore = getWindow(mc).getFramebufferWidth();
int displayHeightBefore = mc.window.getFramebufferHeight(); int displayHeightBefore = getWindow(mc).getFramebufferHeight();
//noinspection ConstantConditions //noinspection ConstantConditions
MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.window; MainWindowAccessor acc = (MainWindowAccessor) (Object) getWindow(mc);
acc.setFramebufferWidth(displayWidth); acc.setFramebufferWidth(displayWidth);
acc.setFramebufferHeight(displayHeight); acc.setFramebufferHeight(displayHeight);
//#else //#else
@@ -248,13 +259,16 @@ public class VideoRenderer implements RenderInfo {
timelinePlayer = new TimelinePlayer(replayHandler); timelinePlayer = new TimelinePlayer(replayHandler);
timelinePlayerFuture = timelinePlayer.start(timeline); timelinePlayerFuture = timelinePlayer.start(timeline);
// FBOs are always used in 1.14+
//#if MC<11400
if (!GLX.isUsingFBOs()) { if (!GLX.isUsingFBOs()) {
//#if MC>=11300 //#if MC>=11300
GLFW.glfwSetWindowAttrib(mc.window.getHandle(), GLFW.GLFW_RESIZABLE, 1); GLFW.glfwSetWindowAttrib(getWindow(mc).getHandle(), GLFW.GLFW_RESIZABLE, 1);
//#else //#else
//$$ Display.setResizable(false); //$$ Display.setResizable(false);
//#endif //#endif
} }
//#endif
if (mc.options.debugEnabled) { if (mc.options.debugEnabled) {
debugInfoWasShown = true; debugInfoWasShown = true;
mc.options.debugEnabled = false; mc.options.debugEnabled = false;
@@ -304,7 +318,7 @@ public class VideoRenderer implements RenderInfo {
//$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); //$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
//#endif //#endif
//#if MC>=10800 //#if MC>=10800 && MC<11500
chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.worldRenderer); chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.worldRenderer);
//#endif //#endif
@@ -323,13 +337,16 @@ public class VideoRenderer implements RenderInfo {
// Tear down of the timeline player might only happen the next tick after it was cancelled // Tear down of the timeline player might only happen the next tick after it was cancelled
timelinePlayer.onTick(); timelinePlayer.onTick();
// FBOs are always used in 1.14+
//#if MC<11400
if (!GLX.isUsingFBOs()) { if (!GLX.isUsingFBOs()) {
//#if MC>=11300 //#if MC>=11300
GLFW.glfwSetWindowAttrib(mc.window.getHandle(), GLFW.GLFW_RESIZABLE, 0); GLFW.glfwSetWindowAttrib(getWindow(mc).getHandle(), GLFW.GLFW_RESIZABLE, 0);
//#else //#else
//$$ Display.setResizable(true); //$$ Display.setResizable(true);
//#endif //#endif
} }
//#endif
mc.options.debugEnabled = debugInfoWasShown; mc.options.debugEnabled = debugInfoWasShown;
if (mouseWasGrabbed) { if (mouseWasGrabbed) {
//#if MC>=11300 //#if MC>=11300
@@ -342,7 +359,7 @@ public class VideoRenderer implements RenderInfo {
mc.options.setSoundVolume(entry.getKey(), entry.getValue()); mc.options.setSoundVolume(entry.getKey(), entry.getValue());
} }
mc.openScreen(null); mc.openScreen(null);
//#if MC>=10800 //#if MC>=10800 && MC<11500
if (chunkLoadingRenderGlobal != null) { if (chunkLoadingRenderGlobal != null) {
chunkLoadingRenderGlobal.uninstall(); chunkLoadingRenderGlobal.uninstall();
} }
@@ -366,7 +383,7 @@ public class VideoRenderer implements RenderInfo {
//#endif //#endif
); );
//noinspection ConstantConditions //noinspection ConstantConditions
MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.window; MainWindowAccessor acc = (MainWindowAccessor) (Object) getWindow(mc);
acc.setFramebufferWidth(displayWidth); acc.setFramebufferWidth(displayWidth);
acc.setFramebufferHeight(displayHeight); acc.setFramebufferHeight(displayHeight);
//#else //#else
@@ -411,7 +428,7 @@ public class VideoRenderer implements RenderInfo {
if (!settings.isHighPerformance() && displaySizeChanged()) { if (!settings.isHighPerformance() && displaySizeChanged()) {
updateDisplaySize(); updateDisplaySize();
//#if MC>=11300 //#if MC>=11300
guiFramebuffer.resize(mc.window.getFramebufferWidth(), mc.window.getFramebufferHeight() guiFramebuffer.resize(getWindow(mc).getFramebufferWidth(), getWindow(mc).getFramebufferHeight()
//#if MC>=11400 //#if MC>=11400
, false , false
//#endif //#endif
@@ -430,8 +447,18 @@ public class VideoRenderer implements RenderInfo {
enableTexture(); enableTexture();
guiFramebuffer.beginWrite(true); guiFramebuffer.beginWrite(true);
//#if MC>=11500
//$$ Window window = getWindow(mc);
//$$ RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC);
//$$ RenderSystem.matrixMode(GL11.GL_PROJECTION);
//$$ RenderSystem.loadIdentity();
//$$ RenderSystem.ortho(0, window.getFramebufferWidth() / window.getScaleFactor(), window.getFramebufferHeight() / window.getScaleFactor(), 0, 1000, 3000);
//$$ RenderSystem.matrixMode(GL11.GL_MODELVIEW);
//$$ RenderSystem.loadIdentity();
//$$ RenderSystem.translatef(0, 0, -2000);
//#else
//#if MC>=11300 //#if MC>=11300
mc.window.method_4493( getWindow(mc).method_4493(
//#if MC>=11400 //#if MC>=11400
false false
//#endif //#endif
@@ -439,9 +466,10 @@ public class VideoRenderer implements RenderInfo {
//#else //#else
//$$ mc.entityRenderer.setupOverlayRendering(); //$$ mc.entityRenderer.setupOverlayRendering();
//#endif //#endif
//#endif
//#if MC>=11300 //#if MC>=11300
gui.toMinecraft().init(mc, mc.window.getScaledWidth(), mc.window.getScaledHeight()); gui.toMinecraft().init(mc, getWindow(mc).getScaledWidth(), getWindow(mc).getScaledHeight());
//#else //#else
//$$ ScaledResolution scaled = newScaledResolution(mc); //$$ ScaledResolution scaled = newScaledResolution(mc);
//$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); //$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
@@ -482,8 +510,11 @@ public class VideoRenderer implements RenderInfo {
guiFramebuffer.draw(displayWidth, displayHeight); guiFramebuffer.draw(displayWidth, displayHeight);
popMatrix(); popMatrix();
//#if MC>=11500
//$$ getWindow(mc).swapBuffers();
//#else
//#if MC>=11300 //#if MC>=11300
mc.window.setFullscreen(false); getWindow(mc).setFullscreen(false);
//#else //#else
//$$ // if not in high performance mode, update the gui size if screen size changed //$$ // if not in high performance mode, update the gui size if screen size changed
//$$ // otherwise just swap the progress gui to screen //$$ // otherwise just swap the progress gui to screen
@@ -497,6 +528,7 @@ public class VideoRenderer implements RenderInfo {
//#endif //#endif
//$$ } //$$ }
//#endif //#endif
//#endif
//#if MC>=11300 //#if MC>=11300
if (mc.mouse.isCursorLocked()) { if (mc.mouse.isCursorLocked()) {
mc.mouse.unlockCursor(); mc.mouse.unlockCursor();
@@ -519,7 +551,7 @@ public class VideoRenderer implements RenderInfo {
private boolean displaySizeChanged() { private boolean displaySizeChanged() {
//#if MC>=11300 //#if MC>=11300
return displayWidth != mc.window.getWidth() || displayHeight != mc.window.getHeight(); return displayWidth != getWindow(mc).getWidth() || displayHeight != getWindow(mc).getHeight();
//#else //#else
//$$ return displayWidth != Display.getWidth() || displayHeight != Display.getHeight(); //$$ return displayWidth != Display.getWidth() || displayHeight != Display.getHeight();
//#endif //#endif
@@ -527,8 +559,8 @@ public class VideoRenderer implements RenderInfo {
private void updateDisplaySize() { private void updateDisplaySize() {
//#if MC>=11300 //#if MC>=11300
displayWidth = mc.window.getWidth(); displayWidth = getWindow(mc).getWidth();
displayHeight = mc.window.getHeight(); displayHeight = getWindow(mc).getHeight();
//#else //#else
//$$ displayWidth = Display.getWidth(); //$$ displayWidth = Display.getWidth();
//$$ displayHeight = Display.getHeight(); //$$ displayHeight = Display.getHeight();

View File

@@ -1,5 +1,7 @@
package com.replaymod.replay; package com.replaymod.replay;
import com.github.steveice10.packetlib.io.NetOutput;
import com.github.steveice10.packetlib.tcp.io.ByteBufNetOutput;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.io.Files; import com.google.common.io.Files;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
@@ -9,9 +11,6 @@ import com.replaymod.core.utils.Restrictions;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import com.replaymod.replaystudio.io.ReplayInputStream; import com.replaymod.replaystudio.io.ReplayInputStream;
import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio;
import com.replaymod.replaystudio.studio.protocol.StudioCodec;
import com.replaymod.replaystudio.studio.protocol.StudioSession;
import de.johni0702.minecraft.gui.utils.EventRegistrations; import de.johni0702.minecraft.gui.utils.EventRegistrations;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
@@ -26,7 +25,6 @@ import net.minecraft.client.gui.screen.NoticeScreen;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.NetworkState; import net.minecraft.network.NetworkState;
import net.minecraft.network.ClientConnection;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.util.PacketByteBuf; import net.minecraft.util.PacketByteBuf;
import net.minecraft.client.network.packet.ChatMessageS2CPacket; import net.minecraft.client.network.packet.ChatMessageS2CPacket;
@@ -586,12 +584,18 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
p = new GameJoinS2CPacket( p = new GameJoinS2CPacket(
entId, entId,
GameMode.SPECTATOR, GameMode.SPECTATOR,
//#if MC>=11500
//$$ packet.getSeed(),
//#endif
false, false,
packet.getDimension(), packet.getDimension(),
0, // max players (has no getter -> never actually used) 0, // max players (has no getter -> never actually used)
packet.getGeneratorType(), packet.getGeneratorType(),
packet.getChunkLoadDistance(), packet.getChunkLoadDistance(),
packet.hasReducedDebugInfo() packet.hasReducedDebugInfo()
//#if MC>=11500
//$$ , packet.showsDeathScreen()
//#endif
); );
//#else //#else
//#if MC>=10800 //#if MC>=10800
@@ -630,7 +634,14 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
if(p instanceof PlayerRespawnS2CPacket) { if(p instanceof PlayerRespawnS2CPacket) {
PlayerRespawnS2CPacket respawn = (PlayerRespawnS2CPacket) p; PlayerRespawnS2CPacket respawn = (PlayerRespawnS2CPacket) p;
//#if MC>=11400 //#if MC>=11400
p = new PlayerRespawnS2CPacket(respawn.getDimension(), respawn.getGeneratorType(), GameMode.SPECTATOR); p = new PlayerRespawnS2CPacket(
respawn.getDimension(),
//#if MC>=11500
//$$ respawn.method_22425(),
//#endif
respawn.getGeneratorType(),
GameMode.SPECTATOR
);
//#else //#else
//#if MC>=10809 //#if MC>=10809
//$$ p = new SPacketRespawn(respawn.getDimensionID(), //$$ p = new SPacketRespawn(respawn.getDimensionID(),
@@ -684,8 +695,8 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//#endif //#endif
if(cent != null) { if(cent != null) {
if(!allowMovement && !((Math.abs(cent.x - ppl.getX()) > TP_DISTANCE_LIMIT) || if(!allowMovement && !((Math.abs(Entity_getX(cent) - ppl.getX()) > TP_DISTANCE_LIMIT) ||
(Math.abs(cent.z - ppl.getZ()) > TP_DISTANCE_LIMIT))) { (Math.abs(Entity_getZ(cent) - ppl.getZ()) > TP_DISTANCE_LIMIT))) {
return null; return null;
} else { } else {
allowMovement = false; allowMovement = false;
@@ -813,7 +824,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
while (!terminate) { while (!terminate) {
synchronized (FullReplaySender.this) { synchronized (FullReplaySender.this) {
if (replayIn == null) { if (replayIn == null) {
replayIn = replayFile.getPacketData(new ReplayStudio(), true); replayIn = replayFile.getPacketData(getPacketTypeRegistry(true));
} }
// Packet loop // Packet loop
while (true) { while (true) {
@@ -1010,7 +1021,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
} }
if (replayIn == null) { if (replayIn == null) {
replayIn = replayFile.getPacketData(new ReplayStudio(), true); replayIn = replayFile.getPacketData(getPacketTypeRegistry(true));
} }
while (true) { // Send packets while (true) { // Send packets
@@ -1153,8 +1164,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
private static final class PacketData { private static final class PacketData {
private static final com.github.steveice10.netty.buffer.ByteBuf byteBuf = com.github.steveice10.netty.buffer.Unpooled.buffer(); private static final com.github.steveice10.netty.buffer.ByteBuf byteBuf = com.github.steveice10.netty.buffer.Unpooled.buffer();
private static final StudioCodec codecLoginPhase = new StudioCodec(new StudioSession(new ReplayStudio(), false, true)); private static final NetOutput netOutput = new ByteBufNetOutput(byteBuf);
private static final StudioCodec codecPlayPhase = new StudioCodec(new StudioSession(new ReplayStudio(), false, false));
private final int timestamp; private final int timestamp;
private final byte[] bytes; private final byte[] bytes;
@@ -1175,25 +1185,25 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
throw new EOFException(); throw new EOFException();
} }
timestamp = (int) data.getTime(); timestamp = (int) data.getTime();
// We need to re-encode MCProtocolLib packets, so we can later decode them as NMS packets com.replaymod.replaystudio.protocol.Packet packet = data.getPacket();
// We need to re-encode ReplayStudio packets, so we can later decode them as NMS packets
// The main reason we aren't reading them as NMS packets is that we want ReplayStudio to be able // The main reason we aren't reading them as NMS packets is that we want ReplayStudio to be able
// to apply ViaVersion (and potentially other magic) to it. // to apply ViaVersion (and potentially other magic) to it.
synchronized (byteBuf) { synchronized (byteBuf) {
byteBuf.markReaderIndex(); // Mark the current reader and writer index (should be at start) byteBuf.markReaderIndex(); // Mark the current reader and writer index (should be at start)
byteBuf.markWriterIndex(); byteBuf.markWriterIndex();
try { netOutput.writeVarInt(packet.getId());
(loginPhase ? codecLoginPhase : codecPlayPhase).encode(null, data.getPacket(), byteBuf); int idSize = byteBuf.readableBytes();
} catch (Exception e) { int contentSize = packet.getBuf().readableBytes();
throw new IOException(e); bytes = new byte[idSize + contentSize]; // Create bytes array of sufficient size
} byteBuf.readBytes(bytes, 0, idSize);
packet.getBuf().readBytes(bytes, idSize, contentSize);
bytes = new byte[byteBuf.readableBytes()]; // Create bytes array of sufficient size
byteBuf.readBytes(bytes); // Read all data into bytes
byteBuf.resetReaderIndex(); // Reset reader & writer index for next use byteBuf.resetReaderIndex(); // Reset reader & writer index for next use
byteBuf.resetWriterIndex(); byteBuf.resetWriterIndex();
} }
packet.getBuf().release();
} }
} }
} }

View File

@@ -12,6 +12,14 @@ import net.minecraft.client.MinecraftClient;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.util.ScreenshotUtils; import net.minecraft.client.util.ScreenshotUtils;
//#if MC>=11500
//$$ import net.minecraft.client.util.math.MatrixStack;
//#endif
//#if MC>=11300
import static com.replaymod.core.versions.MCVer.getWindow;
//#endif
//#if MC<11300 //#if MC<11300
//$$ import com.google.common.io.Files; //$$ import com.google.common.io.Files;
//$$ import org.apache.commons.io.FileUtils; //$$ import org.apache.commons.io.FileUtils;
@@ -35,7 +43,7 @@ public class NoGuiScreenshot {
} }
//#if MC>=11300 //#if MC>=11300
int frameWidth = mc.window.getFramebufferWidth(), frameHeight = mc.window.getFramebufferHeight(); int frameWidth = getWindow(mc).getFramebufferWidth(), frameHeight = getWindow(mc).getFramebufferHeight();
//#else //#else
//$$ int frameWidth = mc.displayWidth, frameHeight = mc.displayHeight; //$$ int frameWidth = mc.displayWidth, frameHeight = mc.displayHeight;
//#endif //#endif
@@ -56,7 +64,13 @@ public class NoGuiScreenshot {
GlStateManager.enableTexture(); GlStateManager.enableTexture();
//#if MC>=11300 //#if MC>=11300
mc.gameRenderer.renderWorld(MCVer.getRenderPartialTicks(), System.nanoTime()); mc.gameRenderer.renderWorld(
MCVer.getRenderPartialTicks(),
System.nanoTime()
//#if MC>=11500
//$$ , new MatrixStack()
//#endif
);
//#else //#else
//#if MC>=10809 //#if MC>=10809
//$$ mc.entityRenderer.updateCameraAndRender(MCVer.getRenderPartialTicks(), System.nanoTime()); //$$ mc.entityRenderer.updateCameraAndRender(MCVer.getRenderPartialTicks(), System.nanoTime());

File diff suppressed because it is too large Load Diff

View File

@@ -35,8 +35,11 @@ import net.minecraft.network.ClientConnection;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException; //#if MC>=11500
//$$ import com.mojang.blaze3d.systems.RenderSystem;
//$$ import org.lwjgl.opengl.GL11;
//#endif
//#if MC>=11300 //#if MC>=11300
import com.replaymod.replay.mixin.EntityLivingBaseAccessor; import com.replaymod.replay.mixin.EntityLivingBaseAccessor;
@@ -393,7 +396,7 @@ public class ReplayHandler {
CameraEntity cam = getCameraEntity(); CameraEntity cam = getCameraEntity();
if (cam != null) { if (cam != null) {
targetCameraPosition = new Location(cam.x, cam.y, cam.z, cam.yaw, cam.pitch); targetCameraPosition = new Location(Entity_getX(cam), Entity_getY(cam), Entity_getZ(cam), cam.yaw, cam.pitch);
} else { } else {
targetCameraPosition = null; targetCameraPosition = null;
} }
@@ -535,9 +538,9 @@ public class ReplayHandler {
// Update all entity positions (especially prev/lastTick values) // Update all entity positions (especially prev/lastTick values)
for (Entity entity : loadedEntityList(mc.world)) { for (Entity entity : loadedEntityList(mc.world)) {
skipTeleportInterpolation(entity); skipTeleportInterpolation(entity);
entity.prevRenderX = entity.prevX = entity.x; entity.prevRenderX = entity.prevX = Entity_getX(entity);
entity.prevRenderY = entity.prevY = entity.y; entity.prevRenderY = entity.prevY = Entity_getY(entity);
entity.prevRenderZ = entity.prevZ = entity.z; entity.prevRenderZ = entity.prevZ = Entity_getZ(entity);
entity.prevYaw = entity.yaw; entity.prevYaw = entity.yaw;
entity.prevPitch = entity.pitch; entity.prevPitch = entity.pitch;
} }
@@ -576,7 +579,7 @@ public class ReplayHandler {
if (retainCameraPosition) { if (retainCameraPosition) {
CameraEntity cam = getCameraEntity(); CameraEntity cam = getCameraEntity();
if (cam != null) { if (cam != null) {
targetCameraPosition = new Location(cam.x, cam.y, cam.z, targetCameraPosition = new Location(Entity_getX(cam), Entity_getY(cam), Entity_getZ(cam),
cam.yaw, cam.pitch); cam.yaw, cam.pitch);
} else { } else {
targetCameraPosition = null; targetCameraPosition = null;
@@ -618,8 +621,18 @@ public class ReplayHandler {
); );
enableTexture(); enableTexture();
mc.getFramebuffer().beginWrite(true); mc.getFramebuffer().beginWrite(true);
//#if MC>=11500
//$$ Window window = getWindow(mc);
//$$ RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC);
//$$ RenderSystem.matrixMode(GL11.GL_PROJECTION);
//$$ RenderSystem.loadIdentity();
//$$ RenderSystem.ortho(0, window.getFramebufferWidth() / window.getScaleFactor(), window.getFramebufferHeight() / window.getScaleFactor(), 0, 1000, 3000);
//$$ RenderSystem.matrixMode(GL11.GL_MODELVIEW);
//$$ RenderSystem.loadIdentity();
//$$ RenderSystem.translatef(0, 0, -2000);
//#else
//#if MC>=11400 //#if MC>=11400
mc.window.method_4493(true); getWindow(mc).method_4493(true);
//#else //#else
//#if MC>=11300 //#if MC>=11300
//$$ mc.mainWindow.setupOverlayRendering(); //$$ mc.mainWindow.setupOverlayRendering();
@@ -627,6 +640,7 @@ public class ReplayHandler {
//$$ mc.entityRenderer.setupOverlayRendering(); //$$ mc.entityRenderer.setupOverlayRendering();
//#endif //#endif
//#endif //#endif
//#endif
//#if MC>=11300 //#if MC>=11300
Window Window
@@ -645,17 +659,21 @@ public class ReplayHandler {
popMatrix(); popMatrix();
pushMatrix(); pushMatrix();
//#if MC>=11300 //#if MC>=11300
mc.getFramebuffer().draw(mc.window.getFramebufferWidth(), mc.window.getFramebufferHeight()); mc.getFramebuffer().draw(getWindow(mc).getFramebufferWidth(), getWindow(mc).getFramebufferHeight());
//#else //#else
//$$ mc.getFramebuffer().framebufferRender(mc.displayWidth, mc.displayHeight); //$$ mc.getFramebuffer().framebufferRender(mc.displayWidth, mc.displayHeight);
//#endif //#endif
popMatrix(); popMatrix();
//#if MC>=11500
//$$ getWindow(mc).swapBuffers();
//#else
//#if MC>=11300 //#if MC>=11300
mc.window.setFullscreen(true); getWindow(mc).setFullscreen(true);
//#else //#else
//$$ Display.update(); //$$ Display.update();
//#endif //#endif
//#endif
// Send the packets // Send the packets
replaySender.sendPacketsTill(targetTime); replaySender.sendPacketsTill(targetTime);
@@ -676,9 +694,9 @@ public class ReplayHandler {
//#endif //#endif
for (Entity entity : loadedEntityList(mc.world)) { for (Entity entity : loadedEntityList(mc.world)) {
skipTeleportInterpolation(entity); skipTeleportInterpolation(entity);
entity.prevRenderX = entity.prevX = entity.x; entity.prevRenderX = entity.prevX = Entity_getX(entity);
entity.prevRenderY = entity.prevY = entity.y; entity.prevRenderY = entity.prevY = Entity_getY(entity);
entity.prevRenderZ = entity.prevZ = entity.z; entity.prevRenderZ = entity.prevZ = Entity_getZ(entity);
entity.prevYaw = entity.yaw; entity.prevYaw = entity.yaw;
entity.prevPitch = entity.pitch; entity.prevPitch = entity.pitch;
} }

View File

@@ -33,6 +33,8 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Optional; import java.util.Optional;
import static com.replaymod.core.versions.MCVer.*;
public class ReplayModReplay implements Module { public class ReplayModReplay implements Module {
{ instance = this; } { instance = this; }
@@ -66,9 +68,9 @@ public class ReplayModReplay implements Module {
if (camera != null) { if (camera != null) {
Marker marker = new Marker(); Marker marker = new Marker();
marker.setTime(replayHandler.getReplaySender().currentTimeStamp()); marker.setTime(replayHandler.getReplaySender().currentTimeStamp());
marker.setX(camera.x); marker.setX(Entity_getX(camera));
marker.setY(camera.y); marker.setY(Entity_getY(camera));
marker.setZ(camera.z); marker.setZ(Entity_getZ(camera));
marker.setYaw(camera.yaw); marker.setYaw(camera.yaw);
marker.setPitch(camera.pitch); marker.setPitch(camera.pitch);
marker.setRoll(camera.roll); marker.setRoll(camera.roll);

View File

@@ -169,7 +169,7 @@ public class CameraEntity
* @param z Delta in Z direction * @param z Delta in Z direction
*/ */
public void moveCamera(double x, double y, double z) { public void moveCamera(double x, double y, double z) {
setCameraPosition(this.x + x, this.y + y, this.z + z); setCameraPosition(Entity_getX(this) + x, Entity_getY(this) + y, Entity_getZ(this) + z);
} }
/** /**
@@ -179,9 +179,10 @@ public class CameraEntity
* @param z Z coordinate * @param z Z coordinate
*/ */
public void setCameraPosition(double x, double y, double z) { public void setCameraPosition(double x, double y, double z) {
this.prevRenderX = this.prevX = this.x = x; this.prevRenderX = this.prevX = x;
this.prevRenderY = this.prevY = this.y = y; this.prevRenderY = this.prevY = y;
this.prevRenderZ = this.prevZ = this.z = z; this.prevRenderZ = this.prevZ = z;
Entity_setPos(this, x, y, z);
updateBoundingBox(); updateBoundingBox();
} }
@@ -222,9 +223,7 @@ public class CameraEntity
this.prevZ = to.prevZ; this.prevZ = to.prevZ;
this.prevYaw = to.prevYaw; this.prevYaw = to.prevYaw;
this.prevPitch = to.prevPitch; this.prevPitch = to.prevPitch;
this.x = to.x; Entity_setPos(this, Entity_getX(to), Entity_getY(to), Entity_getZ(to));
this.y = to.y + yOffset;
this.z = to.z;
this.yaw = to.yaw; this.yaw = to.yaw;
this.pitch = to.pitch; this.pitch = to.pitch;
this.prevRenderX = to.prevRenderX; this.prevRenderX = to.prevRenderX;
@@ -243,8 +242,8 @@ public class CameraEntity
//#else //#else
//$$ this.boundingBox.setBB(AxisAlignedBB.getBoundingBox( //$$ this.boundingBox.setBB(AxisAlignedBB.getBoundingBox(
//#endif //#endif
this.x - width / 2, this.y, this.z - width / 2, Entity_getX(this) - width / 2, Entity_getY(this), Entity_getZ(this) - width / 2,
this.x + width / 2, this.y + height, this.z + width / 2)); Entity_getX(this) + width / 2, Entity_getY(this) + height, Entity_getZ(this) + width / 2));
} }
@Override @Override

View File

@@ -633,7 +633,7 @@ public class GuiPathing {
if (!replayHandler.isCameraView()) { if (!replayHandler.isCameraView()) {
spectatedId = getRenderViewEntity(replayHandler.getOverlay().getMinecraft()).getEntityId(); spectatedId = getRenderViewEntity(replayHandler.getOverlay().getMinecraft()).getEntityId();
} }
timeline.addPositionKeyframe(time, camera.x, camera.y, camera.z, timeline.addPositionKeyframe(time, Entity_getX(camera), Entity_getY(camera), Entity_getZ(camera),
camera.yaw, camera.pitch, camera.roll, spectatedId); camera.yaw, camera.pitch, camera.roll, spectatedId);
mod.setSelected(path, time); mod.setSelected(path, time);
} }

View File

@@ -82,7 +82,7 @@ public class PathPreviewRenderer extends EventRegistrations {
//#if MC>=10800 //#if MC>=10800
// Eye height is subtracted to make path appear higher (at eye height) than it actually is (at foot height) // Eye height is subtracted to make path appear higher (at eye height) than it actually is (at foot height)
Triple<Double, Double, Double> viewPos = Triple.of(view.x, view.y - view.getStandingEyeHeight(), view.z); Triple<Double, Double, Double> viewPos = Triple.of(Entity_getX(view), Entity_getY(view) - view.getStandingEyeHeight(), Entity_getZ(view));
//#else //#else
//$$ Triple<Double, Double, Double> viewPos = Triple.of(view.posX, view.posY, view.posZ); //$$ Triple<Double, Double, Double> viewPos = Triple.of(view.posX, view.posY, view.posZ);
//#endif //#endif
@@ -208,17 +208,21 @@ public class PathPreviewRenderer extends EventRegistrations {
if (distanceSquared(view, pos1) > renderDistanceSquared) return; if (distanceSquared(view, pos1) > renderDistanceSquared) return;
if (distanceSquared(view, pos2) > renderDistanceSquared) return; if (distanceSquared(view, pos2) > renderDistanceSquared) return;
BufferBuilder_setTranslation(-view.getLeft(), -view.getMiddle(), -view.getRight());
BufferBuilder_beginPosCol(GL11.GL_LINES); BufferBuilder_beginPosCol(GL11.GL_LINES);
BufferBuilder_addPosCol(pos1.getLeft(), pos1.getMiddle(), pos1.getRight(), BufferBuilder_addPosCol(
pos1.getLeft() - view.getLeft(),
pos1.getMiddle() - view.getMiddle(),
pos1.getRight() - view.getRight(),
color >> 16 & 0xff, color >> 16 & 0xff,
color >> 8 & 0xff, color >> 8 & 0xff,
color & 0xff, color & 0xff,
255 255
); );
BufferBuilder_addPosCol(pos2.getLeft(), pos2.getMiddle(), pos2.getRight(), BufferBuilder_addPosCol(
pos2.getLeft() - view.getLeft(),
pos2.getMiddle() - view.getMiddle(),
pos2.getRight() - view.getRight(),
color >> 16 & 0xff, color >> 16 & 0xff,
color >> 8 & 0xff, color >> 8 & 0xff,
color & 0xff, color & 0xff,
@@ -227,13 +231,11 @@ public class PathPreviewRenderer extends EventRegistrations {
GL11.glLineWidth(3); GL11.glLineWidth(3);
Tessellator_getInstance().draw(); Tessellator_getInstance().draw();
BufferBuilder_setTranslation(0, 0, 0);
} }
private void drawPoint(Triple<Double, Double, Double> view, private void drawPoint(Triple<Double, Double, Double> view,
Triple<Double, Double, Double> pos, Triple<Double, Double, Double> pos,
Keyframe keyframe) { Keyframe keyframe) {
BufferBuilder_setTranslation(0, 0, 0);
MCVer.bindTexture(TEXTURE); MCVer.bindTexture(TEXTURE);
@@ -269,8 +271,13 @@ public class PathPreviewRenderer extends EventRegistrations {
pos.getRight() - view.getRight() pos.getRight() - view.getRight()
); );
GL11.glNormal3f(0, 1, 0); GL11.glNormal3f(0, 1, 0);
//#if MC>=11500
//$$ GL11.glRotatef(-getRenderManager().camera.getYaw(), 0, 1, 0);
//$$ GL11.glRotatef(getRenderManager().camera.getPitch(), 1, 0, 0);
//#else
GL11.glRotatef(-getRenderManager().cameraYaw, 0, 1, 0); GL11.glRotatef(-getRenderManager().cameraYaw, 0, 1, 0);
GL11.glRotatef(getRenderManager().cameraPitch, 1, 0, 0); GL11.glRotatef(getRenderManager().cameraPitch, 1, 0, 0);
//#endif
Tessellator_getInstance().draw(); Tessellator_getInstance().draw();
@@ -280,7 +287,6 @@ public class PathPreviewRenderer extends EventRegistrations {
private void drawCamera(Triple<Double, Double, Double> view, private void drawCamera(Triple<Double, Double, Double> view,
Triple<Double, Double, Double> pos, Triple<Double, Double, Double> pos,
Triple<Float, Float, Float> rot) { Triple<Float, Float, Float> rot) {
BufferBuilder_setTranslation(0, 0, 0);
MCVer.bindTexture(CAMERA_HEAD); MCVer.bindTexture(CAMERA_HEAD);

View File

@@ -5,6 +5,13 @@
"server": [], "server": [],
"client": [ "client": [
//#if MC>=10800 //#if MC>=10800
//#if MC<11500
"WorldRendererAccessor",
"MixinChunkRenderWorker",
"MixinEffectRenderer",
"MixinModelRenderer",
"MixinTileEntityRendererDispatcher",
//#endif
"ContainerLocalRenderInformationAccessor", "ContainerLocalRenderInformationAccessor",
//#if MC<10904 //#if MC<10904
//$$ "EntityAccessor", //$$ "EntityAccessor",
@@ -13,15 +20,10 @@
"ItemRendererAccessor", "ItemRendererAccessor",
//#endif //#endif
"ParticleAccessor", "ParticleAccessor",
"WorldRendererAccessor",
"MixinChunkRenderWorker",
"MixinEffectRenderer",
"MixinModelRenderer",
"MixinRenderGlobal", "MixinRenderGlobal",
"MixinRenderItem", "MixinRenderItem",
"MixinRenderLivingBase", "MixinRenderLivingBase",
"MixinRenderManager", "MixinRenderManager"
"MixinTileEntityRendererDispatcher"
//#endif //#endif
], ],
"compatibilityLevel": "JAVA_8", "compatibilityLevel": "JAVA_8",

View File

@@ -4,7 +4,11 @@
"mixins": [], "mixins": [],
"server": [], "server": [],
"client": [ "client": [
//#if MC>=10800 "Mixin_ChromaKeyColorSky",
"Mixin_ChromaKeyForceSky",
"Mixin_CubicRotation",
"Mixin_SkipBlockOutlinesDuringRender",
//#if MC>=10800 && MC<11500
"ChunkRenderDispatcherAccessor", "ChunkRenderDispatcherAccessor",
"MixinChunkRenderWorker", "MixinChunkRenderWorker",
//#endif //#endif
@@ -13,7 +17,9 @@
//#endif //#endif
"WorldRendererAccessor", "WorldRendererAccessor",
//#if MC>=10904 //#if MC>=10904
//#if MC<11500
"MixinParticleManager", "MixinParticleManager",
//#endif
//#else //#else
//$$ "MixinEffectRenderer", //$$ "MixinEffectRenderer",
//$$ "MixinRendererLivingEntity", //$$ "MixinRendererLivingEntity",
@@ -29,7 +35,9 @@
"MixinFrustum", "MixinFrustum",
"MixinRender", "MixinRender",
//#if MC>=10800 //#if MC>=10800
//#if MC<11500
"MixinRenderGlobal", "MixinRenderGlobal",
//#endif
//#else //#else
//$$ "MixinOpenGlHelper", //$$ "MixinOpenGlHelper",
//#endif //#endif

View File

@@ -216,15 +216,19 @@ dependencies {
if (FABRIC) { if (FABRIC) {
minecraft 'com.mojang:minecraft:' + [ minecraft 'com.mojang:minecraft:' + [
11404: '1.14.4', 11404: '1.14.4',
11501: '1.15.1',
][mcVersion] ][mcVersion]
mappings 'net.fabricmc:yarn:' + [ mappings 'net.fabricmc:yarn:' + [
11404: '1.14.4+build.1', 11404: '1.14.4+build.1',
11501: '1.15.1+build.37',
][mcVersion] ][mcVersion]
modCompile 'net.fabricmc:fabric-loader:' + [ modCompile 'net.fabricmc:fabric-loader:' + [
11404: '0.4.8+build.155', 11404: '0.4.8+build.155',
11501: '0.7.4+build.177',
][mcVersion] ][mcVersion]
modCompile 'net.fabricmc.fabric-api:fabric-api:' + [ modCompile 'net.fabricmc.fabric-api:fabric-api:' + [
11404: '0.3.0+build.200', 11404: '0.3.0+build.200',
11501: '0.4.27+build.286-1.15',
][mcVersion] ][mcVersion]
} }
@@ -258,9 +262,7 @@ dependencies {
shadow 'com.github.ReplayMod.JavaBlend:2.79.0:a0696f8' shadow 'com.github.ReplayMod.JavaBlend:2.79.0:a0696f8'
def studioVersion = mcVersionStr shadow "com.replaymod.replaystudio:ReplayStudio:120feb9", shadeExclusions
if (studioVersion == '1.8.9') studioVersion = '1.8'
shadow "com.github.ReplayMod.ReplayStudio:$studioVersion:e657fe8", shadeExclusions
shadowReobf(project(":jGui:$jGuiVersion")){ shadowReobf(project(":jGui:$jGuiVersion")){
transitive = false // FG 1.2 puts all MC deps into the compile configuration and we don't want to shade those transitive = false // FG 1.2 puts all MC deps into the compile configuration and we don't want to shade those

View File

@@ -0,0 +1,28 @@
net.minecraft.client.model.ModelPart.Cuboid net.minecraft.client.model.Box
net.minecraft.client.render.chunk.ChunkBuilder net.minecraft.client.render.chunk.ChunkRenderWorker
net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk net.minecraft.client.render.chunk.ChunkRenderer
net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk.Task net.minecraft.client.render.chunk.ChunkRenderTask
net.minecraft.client.network.packet.PlayerActionResponseS2CPacket net.minecraft.class_4463
net.minecraft.network.NetworkState LOGIN field_11688
net.minecraft.network.NetworkState PLAY field_11690
net.fabricmc.fabric.impl.resource.loader.ModResourcePackUtil net.fabricmc.fabric.impl.resources.ModResourcePackUtil
net.minecraft.client.render.entity.EntityRenderer shouldRender() isVisible()
net.minecraft.client.render.Frustum net.minecraft.client.render.VisibleRegion
net.minecraft.client.render.GameRenderer renderWorld() renderCenter()
net.minecraft.entity.LivingEntity serverX field_6224
net.minecraft.entity.LivingEntity serverY field_6245
net.minecraft.entity.LivingEntity serverZ field_6263
net.minecraft.entity.LivingEntity serverYaw field_6284
net.minecraft.entity.LivingEntity serverPitch field_6221
net.minecraft.client.render.WorldRenderer drawBlockOutline() drawHighlightedBlockOutline()
net.minecraft.client.render.GameRenderer method_22973() applyCameraTransformations()
net.minecraft.client.util.math.Matrix4f viewboxMatrix() method_4929()
net.minecraft.util.ThreadExecutor send() method_18858()
net.minecraft.util.ThreadExecutor createTask() prepareRunnable()
net.minecraft.util.ThreadExecutor canExecute() canRun()
net.minecraft.util.ThreadExecutor runTasks() executeTaskQueue()
net.minecraft.util.ThreadExecutor submit() executeFuture()
net.minecraft.client.util.Window method_4493()
net.minecraft.util.SystemUtil.OperatingSystem WINDOWS field_1133
net.minecraft.util.SystemUtil.OperatingSystem OSX field_1137
net.minecraft.client.util.ScreenshotUtils takeScreenshot() method_1663()