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

@@ -15,7 +15,9 @@ import com.replaymod.recording.ReplayModRecording;
import com.replaymod.render.ReplayModRender;
import com.replaymod.replay.ReplayModReplay;
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.viaversion.ViaVersionPacketConverter;
import com.replaymod.simplepathing.ReplayModSimplePathing;
import de.johni0702.minecraft.gui.container.GuiScreen;
import lombok.Getter;
@@ -30,8 +32,6 @@ import net.minecraft.util.Formatting;
import org.apache.commons.io.FileUtils;
//#if MC>=11400
import com.github.steveice10.mc.protocol.MinecraftConstants;
import net.minecraft.SharedConstants;
import net.minecraft.client.options.Option;
import net.minecraft.resource.ResourcePackCreator;
import net.minecraft.resource.ResourcePackContainer;
@@ -99,8 +99,6 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static com.replaymod.core.versions.MCVer.*;
//#if FABRIC<=0
//#if MC>=11300
//$$ @Mod(ReplayMod.MOD_ID)
@@ -180,19 +178,8 @@ public class ReplayMod implements
//#if MC>=11400
// Check Minecraft protocol version for compatibility
int supportedProtocol = MinecraftConstants.PROTOCOL_VERSION;
int actualProtocol = SharedConstants.getGameVersion().getProtocolVersion();
if (supportedProtocol != actualProtocol && !Boolean.parseBoolean(System.getProperty("replaymod.skipversioncheck", "false"))) {
if (!ProtocolVersion.isRegistered(MCVer.getProtocolVersion()) && !Boolean.parseBoolean(System.getProperty("replaymod.skipversioncheck", "false"))) {
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
@@ -453,7 +440,10 @@ public class ReplayMod implements
public static class ReplayModExecutor extends NonBlockingThreadExecutor<Runnable> {
private final Thread mcThread = Thread.currentThread();
// 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(); }
//#endif
private ReplayModExecutor(String string_1) {
super(string_1);
@@ -474,7 +464,7 @@ public class ReplayMod implements
return mcThread;
}
//#if FABRIC>=1
//#if FABRIC>=1 && MC<11500
@Override
public void send(Runnable runnable) {
method_18858(runnable);
@@ -649,7 +639,7 @@ public class ReplayMod implements
if (isMinimalMode()) {
return protocolVersion == MCVer.getProtocolVersion();
} 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.gson.Gson;
import com.replaymod.core.versions.MCVer;
import com.replaymod.replaystudio.io.ReplayInputStream;
import com.replaymod.replaystudio.io.ReplayOutputStream;
import com.replaymod.replaystudio.replay.ReplayFile;
@@ -56,8 +57,8 @@ public class RestoreReplayGui extends AbstractGuiScreen<RestoreReplayGui> {
if (metaData != null && metaData.getDuration() == 0) {
// Try to restore replay duration
// 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);
ReplayOutputStream out = replayFile.writePacketData(true)) {
try (ReplayInputStream in = replayFile.getPacketData(MCVer.getPacketTypeRegistry(true));
ReplayOutputStream out = replayFile.writePacketData()) {
while (true) {
// 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.

View File

@@ -32,9 +32,6 @@ public interface MinecraftAccessor {
//$$ Queue<FutureTask<?>> getScheduledTasks();
//#endif
@Accessor("crashed")
boolean hasCrashed();
@Accessor("crashReport")
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.callback.CallbackInfo;
//#if MC>=11500
//$$ import net.minecraft.client.util.math.MatrixStack;
//#endif
@Mixin(GameRenderer.class)
public class MixinGameRenderer {
@Inject(
@@ -19,12 +23,24 @@ public class MixinGameRenderer {
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();
}
@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()) {
ci.cancel();
}

View File

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

View File

@@ -137,7 +137,15 @@ public class LangResourcePack extends AbstractFileResourcePack {
@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)) {
Path base = baseLangPath();
//#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.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.gui.screen.Screen;
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.widget.ButtonWidget;
import net.minecraft.client.gui.widget.AbstractButtonWidget;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
//#else
//$$ import com.google.common.util.concurrent.FutureCallback;
@@ -76,7 +81,9 @@ import net.minecraft.client.render.BufferBuilder;
import com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormatElement;
//#if MC<11500
import net.minecraft.client.render.chunk.ChunkRenderTask;
//#endif
//#else
//$$ import com.replaymod.core.mixin.ResourcePackRepositoryAccessor;
//$$ import com.google.common.util.concurrent.Futures;
@@ -134,10 +141,18 @@ public class MCVer {
//#if MC>=11400
return SharedConstants.getGameVersion().getProtocolVersion();
//#else
// FIXME
//$$ throw new UnsupportedOperationException("Minimal mode not supported pre-1.14");
//#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) {
//#if MC>=10904
//#if MC>=11200
@@ -150,6 +165,40 @@ public class MCVer {
//#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
public static void width(AbstractButtonWidget button, int value) {
button.setWidth(value);
@@ -314,7 +363,11 @@ public class MCVer {
@SuppressWarnings("unchecked")
public static List<Box> cubeList(Cuboid modelRenderer) {
//#if MC>=11400
//$$ return new ArrayList<>(); // FIXME 1.15
//#else
return modelRenderer.boxes;
//#endif
}
@SuppressWarnings("unchecked")
@@ -335,8 +388,18 @@ public class MCVer {
}
//#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;
//#endif
}
//#endif
//#if MC>=11300
public static Window newScaledResolution(MinecraftClient mc) {
return getWindow(mc);
}
//#else
//$$ public static ScaledResolution newScaledResolution(Minecraft mc) {
@@ -410,10 +473,6 @@ public class MCVer {
//$$ }
//#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) {
Tessellator_getBufferBuilder().begin(
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
Tessellator_getBufferBuilder().vertex(x, y, z).texture(u, v).next();
//#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
Tessellator_getBufferBuilder().vertex(x, y, z).texture(u, v).color(r, g, b, a).next();
//#else
@@ -542,7 +601,7 @@ public class MCVer {
//#endif
}
//#if MC>=10800
//#if MC>=10800 && MC<11500
public interface ChunkRenderWorkerAccessor {
void doRunTask(ChunkRenderTask task) throws InterruptedException;
}
@@ -557,11 +616,15 @@ public class MCVer {
}
public static void bindTexture(Identifier texture) {
//#if MC>=11500
//$$ getMinecraft().getTextureManager().bindTexture(texture);
//#else
//#if MC>=11300
getMinecraft().getTextureManager().bindTexture(texture);
//#else
//$$ getMinecraft().renderEngine.bindTexture(texture);
//#endif
//#endif
}
public static float cos(float val) {
@@ -751,6 +814,9 @@ public class MCVer {
//#endif
public static boolean isKeyDown(int keyCode) {
//#if MC>=11500
//$$ return InputUtil.isKeyPressed(getMinecraft().getWindow().getHandle(), keyCode);
//#else
//#if MC>=11400
return InputUtil.isKeyPressed(getMinecraft().window.getHandle(), keyCode);
//#else
@@ -760,6 +826,7 @@ public class MCVer {
//$$ return org.lwjgl.input.Keyboard.isKeyDown(keyCode);
//#endif
//#endif
//#endif
}
//#if MC<11300

View File

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

View File

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

View File

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

View File

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

View File

@@ -152,9 +152,9 @@ public class RecordingEventHandler extends EventRegistrations {
boolean force = false;
if(lastX == null || lastY == null || lastZ == null) {
force = true;
lastX = player.x;
lastY = player.y;
lastZ = player.z;
lastX = Entity_getX(player);
lastY = Entity_getY(player);
lastZ = Entity_getZ(player);
}
ticksSinceLastCorrection++;
@@ -163,13 +163,13 @@ public class RecordingEventHandler extends EventRegistrations {
force = true;
}
double dx = player.x - lastX;
double dy = player.y - lastY;
double dz = player.z - lastZ;
double dx = Entity_getX(player) - lastX;
double dy = Entity_getY(player) - lastY;
double dz = Entity_getZ(player) - lastZ;
lastX = player.x;
lastY = player.y;
lastZ = player.z;
lastX = Entity_getX(player);
lastY = Entity_getY(player);
lastZ = Entity_getZ(player);
Packet packet;
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;
//#if MC>=10800
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPlayerListEntryPacket;
import com.github.steveice10.packetlib.io.buffer.ByteBufferNetInput;
import com.replaymod.replaystudio.protocol.Packet;
import com.replaymod.replaystudio.protocol.PacketType;
import com.replaymod.replaystudio.protocol.packets.PacketPlayerListEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import net.minecraft.util.PacketByteBuf;
@@ -21,7 +22,6 @@ import net.minecraft.client.network.packet.PlayerListS2CPacket;
import net.minecraft.client.network.PlayerListEntry;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Map;
import java.util.UUID;
//#else
@@ -62,10 +62,9 @@ public abstract class MixinNetHandlerPlayClient {
RecordingEventHandler handler = getRecordingEventHandler();
if (handler != null && packet.getAction() == PlayerListS2CPacket.Action.ADD_PLAYER) {
// 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
// the back to the MCProtocolLib equivalent and deal with that one.
// resolved) reasons (see https://github.com/MinecraftForge/ForgeGradle/issues/472), so we use ReplayStudio
// to parse it instead.
ByteBuf byteBuf = Unpooled.buffer();
ServerPlayerListEntryPacket mcpl = new ServerPlayerListEntryPacket(null, null);
try {
packet.write(new PacketByteBuf(byteBuf));
@@ -73,21 +72,22 @@ public abstract class MixinNetHandlerPlayClient {
byte[] array = new byte[byteBuf.readableBytes()];
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) {
throw new RuntimeException(e); // we just parsed this?
} finally {
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

View File

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

View File

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

View File

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

View File

@@ -174,7 +174,12 @@ public class RenderSettings {
private static String findFFmpeg() {
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:
//#endif
// 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");
if (inDotMinecraft.exists()) {
@@ -182,7 +187,12 @@ public class RenderSettings {
return inDotMinecraft.getAbsolutePath();
}
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:
//#endif
// 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"}) {
File file = new File(path);

View File

@@ -11,6 +11,10 @@ import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormatElement;
import org.lwjgl.opengl.GL11;
//#if MC>=11500
//$$ import com.mojang.datafixers.util.Pair;
//#endif
//#if MC>=10904
//#if MC>=11200
import net.minecraft.client.render.BufferBuilder;
@@ -135,7 +139,12 @@ public class BlendMeshBuilder
//#else
//$$ public static DMesh addBufferToMesh(WorldRenderer bufferBuilder, DMesh mesh, Vector3f vertOffset) {
//#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);
//#endif
}
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
int posOffset = -1, colorOffset = -1, uvOffset = -1;
int index = 0;
//#if MC>=11500
int elementOffset = 0;
//#endif
for (VertexFormatElement element : getElements(vertexFormat)) {
//#if MC>=11500
//$$ int offset = elementOffset;
//$$ elementOffset += element.getSize();
//#else
//#if MC>=10809
int offset = vertexFormat.getElementOffset(index);
//#else
//$$ int offset = element.getOffset();
//#endif
//#endif
switch (element.getType()) {
case POSITION:
//#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.Serializer;
//#if MC>=10800
// FIXME 1.15
//#if MC<11500
import com.replaymod.render.blend.exporters.ChunkExporter;
//#endif
import com.replaymod.render.blend.exporters.EntityExporter;
import com.replaymod.render.blend.exporters.ItemExporter;
import com.replaymod.render.blend.exporters.ParticlesExporter;
@@ -53,7 +56,10 @@ public class BlendState implements Exporter {
//#if MC>=10800
RenderState renderState = new RenderState(this);
register(renderState);
// FIXME 1.15
//#if MC<11500
register(new ChunkExporter());
//#endif
register(new EntityExporter(renderState));
register(new TileEntityExporter(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;
import com.replaymod.core.versions.MCVer;

View File

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

View File

@@ -67,7 +67,11 @@ public class ModelRendererExporter implements Exporter {
}
if (object == null) {
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;
//#endif
object.setParent(parent);
}
object.lastFrame = frame;
@@ -78,7 +82,11 @@ public class ModelRendererExporter implements Exporter {
DMesh mesh = new DMesh();
BlendMeshBuilder builder = new BlendMeshBuilder(mesh);
for (Box box : cubeList(model)) {
//#if MC>=11500
//$$ // FIXME 1.15
//#else
box.render(builder, scale);
//#endif
}
builder.maybeFinishDrawing();
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.
Matrix4f modelView = getGlModelViewMatrix();
ParticleAccessor acc = (ParticleAccessor) particle;
double dx = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * renderPartialTicks - Particle.cameraX;
double dy = acc.getPrevPosY() + (acc.getPosY() - acc.getPrevPosY()) * renderPartialTicks - Particle.cameraY;
double dz = acc.getPrevPosZ() + (acc.getPosZ() - acc.getPrevPosZ()) * renderPartialTicks - Particle.cameraZ;
double dx = acc.getPrevPosX() + (acc.getPosX() - acc.getPrevPosX()) * renderPartialTicks;
double dy = acc.getPrevPosY() + (acc.getPosY() - acc.getPrevPosY()) * renderPartialTicks;
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);
Matrix4f.translate(offset, modelView, modelView);
renderState.pushModelView(modelView);
@@ -173,7 +180,11 @@ public class ParticlesExporter implements Exporter {
//#else
//$$ MCVer.getMinecraft().getRenderViewEntity(),
//#endif
0, 1, 1, 0, 0, 0);
0
//#if MC<11500
, 1, 1, 0, 0, 0
//#endif
);
//#else
//$$ particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0);
//#endif

View File

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

View File

@@ -1,4 +1,5 @@
//#if MC>=10800
// FIXME 1.15
//#if MC>=10800 && MC<11500
package com.replaymod.render.blend.mixin;
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;
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;
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.Inject;
//#if MC>=11500
//$$ import net.minecraft.client.render.VertexConsumerProvider;
//$$ import net.minecraft.client.util.math.MatrixStack;
//#endif
//#if MC>=10904
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#else
@@ -19,6 +24,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class MixinRenderManager {
@Inject(
//#if MC>=11500
//$$ method = "render",
//#else
//#if MC>=11400
method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V",
//#else
@@ -28,9 +36,17 @@ public abstract class MixinRenderManager {
//$$ method = "doRenderEntity",
//#endif
//#endif
//#endif
at = @At(value = "INVOKE",
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
CallbackInfo ci) {
//#else
@@ -43,6 +59,9 @@ public abstract class MixinRenderManager {
}
@Inject(
//#if MC>=11500
//$$ method = "render",
//#else
//#if MC>=11400
method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V",
//#else
@@ -52,10 +71,18 @@ public abstract class MixinRenderManager {
//$$ method = "doRenderEntity",
//#endif
//#endif
//#endif
at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/render/entity/EntityRenderer;render(Lnet/minecraft/entity/Entity;DDDFF)V",
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
CallbackInfo ci) {
//#else

View File

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

View File

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

View File

@@ -244,7 +244,7 @@ public class GuiVideoRenderer extends GuiScreen implements Tickable {
previewTextureDirty = false;
}
guiRenderer.bindTexture(previewTexture);
guiRenderer.bindTexture(previewTexture.getGlId());
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;
import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor;

View File

@@ -8,6 +8,10 @@ import com.replaymod.render.capturer.WorldRenderer;
import lombok.Getter;
import net.minecraft.client.MinecraftClient;
//#if MC>=11500
//$$ import net.minecraft.client.util.math.MatrixStack;
//#endif
//#if MC>=11400
import com.replaymod.core.events.PostRenderCallback;
import com.replaymod.core.events.PreRenderCallback;
@@ -59,7 +63,13 @@ public class EntityRendererHandler implements WorldRenderer {
//#endif
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

View File

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

View File

@@ -1,12 +1,10 @@
package com.replaymod.render.mixin;
import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.CubicOpenGlFrameCapturer;
import com.replaymod.render.hooks.EntityRendererHandler;
import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
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;
//#if MC>=10800
//#if MC>=10800 && MC<11500
import com.replaymod.core.versions.MCVer;
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.render.capturer.StereoscopicOpenGlFrameCapturer;
import com.replaymod.render.hooks.EntityRendererHandler;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.player.PlayerEntity;
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.callback.CallbackInfo;
//#if MC>=11500
//$$ import net.minecraft.client.util.math.MatrixStack;
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
//#endif
//#if MC>=11400
import net.minecraft.client.render.Camera;
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)
private void replayModRender_renderSpectatorHand(
//#if MC>=11500
//$$ MatrixStack matrixStack,
//#endif
//#if MC>=11400
Camera camera,
//#endif
@@ -128,102 +135,27 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//$$ public abstract void renderHand(float partialTicks, int renderPass);
//#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
*/
//#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
@Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 0))
//#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
@Inject(method = "applyCameraTransformations", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;loadIdentity()V", shift = At.Shift.AFTER, ordinal = 1))
//#else
@@ -265,6 +210,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
}
}
}
//#endif
/*
* Cubic Renderer
@@ -276,6 +222,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
}
//#if MC<11500
//#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;"))
//#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) {
return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
}
//#endif
private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNear, float zFar) {
if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {

View File

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

View File

@@ -1,6 +1,7 @@
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.render.blend.BlendState;
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.render.hooks.EntityRendererHandler;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -11,12 +10,16 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(EntityRenderer.class)
public abstract class MixinRender {
//#if MC>=11500
//$$ @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true)
//#else
//#if MC>=11400
@Inject(method = "renderLabel(Lnet/minecraft/entity/Entity;Ljava/lang/String;DDDI)V", at = @At("HEAD"), cancellable = true)
//#else
//$$ @Inject(method = "renderLivingLabel", at = @At("HEAD"), cancellable = true)
//#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();
if (handler != null && !handler.getSettings().isRenderNameTags()) {
ci.cancel();

View File

@@ -1,4 +1,4 @@
//#if MC>=10800
//#if MC>=10800 && MC<11500
package com.replaymod.render.mixin;
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.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
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#else
@@ -17,12 +24,16 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(EntityRenderDispatcher.class)
public abstract class MixinRenderManager {
@Shadow
private float cameraPitch;
@Shadow
private float cameraYaw;
//#if MC>=11500
//$$ @Shadow private Quaternion rotation;
//#else
@Shadow private float cameraPitch;
@Shadow private float cameraYaw;
//#endif
//#if MC>=11400
//$$ @Inject(method = "render", at = @At("HEAD"))
//#else
//#if MC>=11400
@Inject(method = "render(Lnet/minecraft/entity/Entity;DDDFFZ)V", at = @At("HEAD"))
//#else
@@ -32,8 +43,17 @@ public abstract class MixinRenderManager {
//$$ @Inject(method = "doRenderEntity", at = @At("HEAD"))
//#endif
//#endif
//#endif
//#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
//$$ private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfoReturnable<Boolean> ci) {
//#endif
@@ -41,8 +61,14 @@ public abstract class MixinRenderManager {
if (handler != null && handler.omnidirectional) {
double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * 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.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)
public interface WorldRendererAccessor {
//#if MC<11500
@Accessor("field_4076")
void setRenderEntitiesStartupCounter(int value);
@@ -26,4 +27,5 @@ public interface WorldRendererAccessor {
@Accessor("chunkRenderers")
Set<ChunkRenderer> getChunksToUpdate();
//#endif
//#endif
}

View File

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

View File

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

View File

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

View File

@@ -12,6 +12,14 @@ import net.minecraft.client.MinecraftClient;
import com.mojang.blaze3d.platform.GlStateManager;
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
//$$ import com.google.common.io.Files;
//$$ import org.apache.commons.io.FileUtils;
@@ -35,7 +43,7 @@ public class NoGuiScreenshot {
}
//#if MC>=11300
int frameWidth = mc.window.getFramebufferWidth(), frameHeight = mc.window.getFramebufferHeight();
int frameWidth = getWindow(mc).getFramebufferWidth(), frameHeight = getWindow(mc).getFramebufferHeight();
//#else
//$$ int frameWidth = mc.displayWidth, frameHeight = mc.displayHeight;
//#endif
@@ -56,7 +64,13 @@ public class NoGuiScreenshot {
GlStateManager.enableTexture();
//#if MC>=11300
mc.gameRenderer.renderWorld(MCVer.getRenderPartialTicks(), System.nanoTime());
mc.gameRenderer.renderWorld(
MCVer.getRenderPartialTicks(),
System.nanoTime()
//#if MC>=11500
//$$ , new MatrixStack()
//#endif
);
//#else
//#if MC>=10809
//$$ 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.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
import com.replaymod.replay.mixin.EntityLivingBaseAccessor;
@@ -393,7 +396,7 @@ public class ReplayHandler {
CameraEntity cam = getCameraEntity();
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 {
targetCameraPosition = null;
}
@@ -535,9 +538,9 @@ public class ReplayHandler {
// Update all entity positions (especially prev/lastTick values)
for (Entity entity : loadedEntityList(mc.world)) {
skipTeleportInterpolation(entity);
entity.prevRenderX = entity.prevX = entity.x;
entity.prevRenderY = entity.prevY = entity.y;
entity.prevRenderZ = entity.prevZ = entity.z;
entity.prevRenderX = entity.prevX = Entity_getX(entity);
entity.prevRenderY = entity.prevY = Entity_getY(entity);
entity.prevRenderZ = entity.prevZ = Entity_getZ(entity);
entity.prevYaw = entity.yaw;
entity.prevPitch = entity.pitch;
}
@@ -576,7 +579,7 @@ public class ReplayHandler {
if (retainCameraPosition) {
CameraEntity cam = getCameraEntity();
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);
} else {
targetCameraPosition = null;
@@ -618,8 +621,18 @@ public class ReplayHandler {
);
enableTexture();
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
mc.window.method_4493(true);
getWindow(mc).method_4493(true);
//#else
//#if MC>=11300
//$$ mc.mainWindow.setupOverlayRendering();
@@ -627,6 +640,7 @@ public class ReplayHandler {
//$$ mc.entityRenderer.setupOverlayRendering();
//#endif
//#endif
//#endif
//#if MC>=11300
Window
@@ -645,17 +659,21 @@ public class ReplayHandler {
popMatrix();
pushMatrix();
//#if MC>=11300
mc.getFramebuffer().draw(mc.window.getFramebufferWidth(), mc.window.getFramebufferHeight());
mc.getFramebuffer().draw(getWindow(mc).getFramebufferWidth(), getWindow(mc).getFramebufferHeight());
//#else
//$$ mc.getFramebuffer().framebufferRender(mc.displayWidth, mc.displayHeight);
//#endif
popMatrix();
//#if MC>=11500
//$$ getWindow(mc).swapBuffers();
//#else
//#if MC>=11300
mc.window.setFullscreen(true);
getWindow(mc).setFullscreen(true);
//#else
//$$ Display.update();
//#endif
//#endif
// Send the packets
replaySender.sendPacketsTill(targetTime);
@@ -676,9 +694,9 @@ public class ReplayHandler {
//#endif
for (Entity entity : loadedEntityList(mc.world)) {
skipTeleportInterpolation(entity);
entity.prevRenderX = entity.prevX = entity.x;
entity.prevRenderY = entity.prevY = entity.y;
entity.prevRenderZ = entity.prevZ = entity.z;
entity.prevRenderX = entity.prevX = Entity_getX(entity);
entity.prevRenderY = entity.prevY = Entity_getY(entity);
entity.prevRenderZ = entity.prevZ = Entity_getZ(entity);
entity.prevYaw = entity.yaw;
entity.prevPitch = entity.pitch;
}

View File

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

View File

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

View File

@@ -633,7 +633,7 @@ public class GuiPathing {
if (!replayHandler.isCameraView()) {
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);
mod.setSelected(path, time);
}

View File

@@ -82,7 +82,7 @@ public class PathPreviewRenderer extends EventRegistrations {
//#if MC>=10800
// 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
//$$ Triple<Double, Double, Double> viewPos = Triple.of(view.posX, view.posY, view.posZ);
//#endif
@@ -208,17 +208,21 @@ public class PathPreviewRenderer extends EventRegistrations {
if (distanceSquared(view, pos1) > renderDistanceSquared) return;
if (distanceSquared(view, pos2) > renderDistanceSquared) return;
BufferBuilder_setTranslation(-view.getLeft(), -view.getMiddle(), -view.getRight());
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 >> 8 & 0xff,
color & 0xff,
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 >> 8 & 0xff,
color & 0xff,
@@ -227,13 +231,11 @@ public class PathPreviewRenderer extends EventRegistrations {
GL11.glLineWidth(3);
Tessellator_getInstance().draw();
BufferBuilder_setTranslation(0, 0, 0);
}
private void drawPoint(Triple<Double, Double, Double> view,
Triple<Double, Double, Double> pos,
Keyframe keyframe) {
BufferBuilder_setTranslation(0, 0, 0);
MCVer.bindTexture(TEXTURE);
@@ -269,8 +271,13 @@ public class PathPreviewRenderer extends EventRegistrations {
pos.getRight() - view.getRight()
);
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().cameraPitch, 1, 0, 0);
//#endif
Tessellator_getInstance().draw();
@@ -280,7 +287,6 @@ public class PathPreviewRenderer extends EventRegistrations {
private void drawCamera(Triple<Double, Double, Double> view,
Triple<Double, Double, Double> pos,
Triple<Float, Float, Float> rot) {
BufferBuilder_setTranslation(0, 0, 0);
MCVer.bindTexture(CAMERA_HEAD);