Get replay module compiling on 1.13

This commit is contained in:
Jonas Herzig
2018-12-19 10:11:08 +01:00
parent 9655677972
commit 1470123ec9
29 changed files with 476 additions and 206 deletions

View File

@@ -8,6 +8,7 @@ import com.replaymod.core.handler.MainMenuHandler;
import com.replaymod.core.utils.OpenGLUtils;
import com.replaymod.core.versions.MCVer;
import com.replaymod.recording.ReplayModRecording;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replaystudio.util.I18n;
import de.johni0702.minecraft.gui.container.GuiScreen;
import lombok.Getter;
@@ -138,6 +139,7 @@ public class ReplayMod {
private final List<Module> modules = new ArrayList<>();
{
modules.add(new ReplayModRecording(this));
modules.add(new ReplayModReplay(this));
}
public KeyBindingRegistry getKeyBindingRegistry() {

View File

@@ -34,6 +34,10 @@ import net.minecraftforge.common.MinecraftForge;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
//#if MC>=11300
import net.minecraft.util.ResourceLocation;
//#endif
//#if MC>=11200
import com.replaymod.core.utils.WrappedTimer;
//#endif
@@ -49,7 +53,11 @@ import net.minecraft.util.text.ITextComponent;
//#endif
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#if MC>=11300
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
import net.minecraftforge.fml.common.gameevent.TickEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
@@ -185,7 +193,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
/**
* The minecraft instance.
*/
protected Minecraft mc = Minecraft.getMinecraft();
protected Minecraft mc = getMinecraft();
/**
* The total length of this replay in milliseconds.
@@ -265,7 +273,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
}
/**
* Return a fake {@link Minecraft#getSystemTime()} value that respects slowdown/speedup/pause and works in both,
* Return a fake system tile in milliseconds value that respects slowdown/speedup/pause and works in both,
* sync and async mode.
* Note: For sync mode this returns the last value passed to {@link #sendPacketsTill(int)}.
* @return The timestamp in milliseconds since the start of the replay
@@ -308,7 +316,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
if (world(mc) != null) {
for (EntityPlayer playerEntity : playerEntities(world(mc))) {
if (!playerEntity.addedToChunk && playerEntity instanceof EntityOtherPlayerMP) {
playerEntity.onLivingUpdate();
// FIXME playerEntity.onLivingUpdate();
}
}
}
@@ -361,7 +369,11 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
World world = world(mc);
for (int i = 0; i < world.loadedEntityList.size(); ++i) {
Entity entity = loadedEntityList(world).get(i);
if (entity.isDead) {
//#if MC>=11300
if (entity.removed) {
//#else
//$$ if (entity.isDead) {
//#endif
int chunkX = entity.chunkCoordX;
int chunkY = entity.chunkCoordZ;
@@ -370,7 +382,12 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//#else
//$$ if (entity.addedToChunk && world.getChunkProvider().chunkExists(chunkX, chunkY)) {
//#endif
world.getChunkFromChunkCoords(chunkX, chunkY).removeEntity(entity);
//#if MC>=11300
//#else
world.getChunk(chunkX, chunkY).removeEntity(entity);
//#else
//$$ world.getChunkFromChunkCoords(chunkX, chunkY).removeEntity(entity);
//#endif
}
world.loadedEntityList.remove(i--);
@@ -418,11 +435,15 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//$$ if (p instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
//#endif
//#if MC>=11300
ResourceLocation channelName = packet.getChannelName();
//#else
//#if MC>=10800
String channelName = packet.getChannelName();
//$$ String channelName = packet.getChannelName();
//#else
//$$ String channelName = packet.func_149169_c();
//#endif
//#endif
if (Restrictions.PLUGIN_CHANNEL.equals(channelName)) {
final String unknown = replayHandler.getRestrictions().handle(packet);
if (unknown == null) {
@@ -459,7 +480,13 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//$$ IChatComponent reason = ((S40PacketDisconnect) p).func_149165_c();
//#endif
//#endif
if ("Please update to view this replay.".equals(reason.getUnformattedText())) {
//#if MC>=11300
// FIXME or is it getString?
String message = reason.getUnformattedComponentText();
//#else
//$$ String message = reason.getUnformattedText();
//#endif
if ("Please update to view this replay.".equals(message)) {
// This version of the mod supports replay restrictions so we are allowed
// to remove this packet.
return null;
@@ -475,6 +502,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//$$ if (p instanceof S3FPacketCustomPayload) {
//$$ S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p;
//#endif
/* FIXME
//#if MC>=10800
String channelName = packet.getChannelName();
//#else
@@ -483,6 +511,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
if ("MC|BOpen".equals(channelName)) {
return null;
}
*/
//#if MC>=10800
}
@@ -514,7 +543,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
if (!file.exists()) {
IOUtils.copy(replayFile.getResourcePack(hash).get(), new FileOutputStream(file));
}
setServerResourcePack(mc.getResourcePackRepository(), file);
// FIXME setServerResourcePack(mc.getResourcePackRepository(), file);
}
}
return null;
@@ -540,7 +569,11 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//#if MC>=10800
int dimension = packet.getDimension();
EnumDifficulty difficulty = packet.getDifficulty();
int maxPlayers = packet.getMaxPlayers();
//#if MC>=11300
int maxPlayers = 0;// FIXME needs AT packet.maxPlayers;
//#else
//$$ int maxPlayers = packet.getMaxPlayers();
//#endif
WorldType worldType = packet.getWorldType();
//#if MC>=10904
@@ -1064,7 +1097,11 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
// Needs to be called at least 4 times thanks to
// EntityOtherPlayerMP#otherPlayerMPPosRotationIncrements (max vanilla value is 3)
for (int i = 0; i < 4; i++) {
entity.onUpdate();
//#if MC>=11300
entity.tick();
//#else
//$$ entity.onUpdate();
//#endif
}
// Check whether the entity has left the chunk

View File

@@ -1,3 +1,4 @@
/* FIXME
package com.replaymod.replay;
import com.replaymod.core.utils.WrappedTimer;
@@ -264,3 +265,4 @@ public class InputReplayTimer extends WrappedTimer {
//$$ public static class RunScheduledTasks extends Event {}
//#endif
}
*/

View File

@@ -38,6 +38,12 @@ public class NoGuiScreenshot {
return;
}
//#if MC>=11300
int frameWidth = mc.mainWindow.getFramebufferWidth(), frameHeight = mc.mainWindow.getFramebufferHeight();
//#else
//$$ int frameWidth = mc.displayWidth, frameHeight = mc.displayHeight;
//#endif
final boolean guiHidden = mc.gameSettings.hideGUI;
try {
mc.gameSettings.hideGUI = true;
@@ -57,7 +63,7 @@ public class NoGuiScreenshot {
mc.getFramebuffer().unbindFramebuffer();
GlStateManager.popMatrix();
GlStateManager.pushMatrix();
mc.getFramebuffer().framebufferRender(mc.displayWidth, mc.displayHeight);
mc.getFramebuffer().framebufferRender(frameWidth, frameHeight);
GlStateManager.popMatrix();
} catch (Throwable t) {
future.setException(t);
@@ -73,7 +79,7 @@ public class NoGuiScreenshot {
// disk for better maintainability
File tmpFolder = Files.createTempDir();
try {
ScreenShotHelper.saveScreenshot(tmpFolder, "tmp", mc.displayWidth, mc.displayHeight, mc.getFramebuffer());
ScreenShotHelper.saveScreenshot(tmpFolder, "tmp", frameWidth, frameHeight, mc.getFramebuffer());
File screenshotFile = new File(tmpFolder, "screenshots/tmp");
BufferedImage image = ImageIO.read(screenshotFile);
int imageWidth = image.getWidth();

View File

@@ -62,7 +62,6 @@ import net.minecraft.network.EnumConnectionState;
import net.minecraft.network.EnumPacketDirection;
import net.minecraft.network.Packet;
import net.minecraft.network.PacketBuffer;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import javax.annotation.Nullable;
@@ -85,11 +84,18 @@ import java.util.function.Consumer;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
//#if MC>=11300
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#if MC>=11200
import com.replaymod.core.utils.WrappedTimer;
//#endif
import static com.replaymod.core.versions.MCVer.FML_BUS;
import static com.replaymod.core.versions.MCVer.getMinecraft;
import static com.replaymod.replay.ReplayModReplay.LOGGER;
/**
@@ -104,7 +110,7 @@ public class QuickReplaySender extends ChannelHandlerAdapter implements ReplaySe
private static final String CACHE_INDEX_ENTRY = "quickModeCacheIndex.bin";
private static final int CACHE_VERSION = 0;
private final Minecraft mc = Minecraft.getMinecraft();
private final Minecraft mc = getMinecraft();
private final ReplayModReplay mod;
private final ReplayFile replayFile;
@@ -980,8 +986,13 @@ public class QuickReplaySender extends ChannelHandlerAdapter implements ReplaySe
for (BlockChange blockChange : blockChanges) {
NetUtil.writePosition(cacheOut, blockChange.pos);
index += 8;
index += writeVarInt(cacheOut, blockChange.from.getId() << 4 | blockChange.from.getData() & 15);
index += writeVarInt(cacheOut, blockChange.to.getId() << 4 | blockChange.to.getData() & 15);
//#if MC>=11300
index += writeVarInt(cacheOut, blockChange.from.getId());
index += writeVarInt(cacheOut, blockChange.to.getId());
//#else
//$$ index += writeVarInt(cacheOut, blockChange.from.getId() << 4 | blockChange.from.getData() & 15);
//$$ index += writeVarInt(cacheOut, blockChange.to.getId() << 4 | blockChange.to.getData() & 15);
//#endif
}
}

View File

@@ -21,19 +21,25 @@ import de.johni0702.minecraft.gui.popup.AbstractGuiPopup;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.embedded.EmbeddedChannel;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityOtherPlayerMP;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.resources.I18n;
import net.minecraft.crash.CrashReport;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.NetworkManager;
import org.lwjgl.opengl.Display;
import java.io.IOException;
import java.util.*;
//#if MC>=11300
import net.minecraft.client.MainWindow;
import net.minecraft.entity.EntityLivingBase;
//#else
//$$ import net.minecraft.client.entity.EntityOtherPlayerMP;
//$$ import net.minecraft.client.gui.ScaledResolution;
//$$ import org.lwjgl.opengl.Display;
//#endif
//#if MC<10904
//$$ import de.johni0702.minecraft.gui.element.GuiLabel;
//$$ import de.johni0702.minecraft.gui.popup.GuiInfoPopup;
@@ -41,11 +47,16 @@ import java.util.*;
//#endif
//#if MC>=10800
import com.mojang.authlib.GameProfile;
import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.network.EnumPacketDirection;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
//#if MC>=11300
import net.minecraft.client.network.NetHandlerLoginClient;
import net.minecraftforge.fml.network.NetworkHooks;
//#else
//$$ import com.mojang.authlib.GameProfile;
//$$ import net.minecraft.client.network.NetHandlerPlayClient;
//$$ import net.minecraftforge.fml.client.FMLClientHandler;
//$$ import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
//#endif
import static net.minecraft.client.renderer.GlStateManager.*;
//#else
@@ -73,7 +84,7 @@ import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
public class ReplayHandler {
private static Minecraft mc = Minecraft.getMinecraft();
private static Minecraft mc = getMinecraft();
/**
* The file currently being played.
@@ -146,7 +157,11 @@ public class ReplayHandler {
// Force re-creation of camera entity by unloading the previous world
mc.addScheduledTask(() -> {
mc.setIngameNotInFocus();
//#if MC>=11300
mc.mouseHelper.ungrabMouse();
//#else
//$$ mc.setIngameNotInFocus();
//#endif
mc.loadWorld(null);
});
@@ -171,7 +186,11 @@ public class ReplayHandler {
channel.close().awaitUninterruptibly();
if (player(mc) instanceof CameraEntity) {
player(mc).setDead();
//#if MC>=11300
player(mc).remove();
//#else
//$$ player(mc).setDead();
//#endif
}
if (world(mc) != null) {
@@ -207,21 +226,32 @@ public class ReplayHandler {
t.printStackTrace();
}
};
NetHandlerPlayClient netHandlerPlayClient =
new NetHandlerPlayClient(mc, null, networkManager, new GameProfile(UUID.randomUUID(), "Player"));
networkManager.setNetHandler(netHandlerPlayClient);
FMLClientHandler.instance().setPlayClient(netHandlerPlayClient);
//#if MC>=11200
//#if MC>=11300
channel = new EmbeddedChannel();
NetworkDispatcher networkDispatcher = new NetworkDispatcher(networkManager);
channel.attr(NetworkDispatcher.FML_DISPATCHER).set(networkDispatcher);
channel.pipeline().addFirst("ReplayModReplay_replaySender", fullReplaySender);
channel.pipeline().addFirst("ReplayModReplay_quickReplaySender", quickReplaySender);
channel.pipeline().addLast("packet_handler", networkManager);
channel.pipeline().fireChannelActive();
networkDispatcher.clientToServerHandshake();
networkManager.setNetHandler(new NetHandlerLoginClient(networkManager, mc, null, it -> {}));
NetworkHooks.registerClientLoginChannel(networkManager);
//#else
//$$ NetHandlerPlayClient netHandlerPlayClient =
//$$ new NetHandlerPlayClient(mc, null, networkManager, new GameProfile(UUID.randomUUID(), "Player"));
//$$ networkManager.setNetHandler(netHandlerPlayClient);
//$$ FMLClientHandler.instance().setPlayClient(netHandlerPlayClient);
//$$
//#if MC>=11200
//$$ channel = new EmbeddedChannel();
//$$ NetworkDispatcher networkDispatcher = new NetworkDispatcher(networkManager);
//$$ channel.attr(NetworkDispatcher.FML_DISPATCHER).set(networkDispatcher);
//$$
//$$ channel.pipeline().addFirst("ReplayModReplay_replaySender", fullReplaySender);
//$$ channel.pipeline().addFirst("ReplayModReplay_quickReplaySender", quickReplaySender);
//$$ channel.pipeline().addLast("packet_handler", networkManager);
//$$ channel.pipeline().fireChannelActive();
//$$ networkDispatcher.clientToServerHandshake();
//#else
//$$ channel = new EmbeddedChannel(networkManager);
//$$ NetworkDispatcher networkDispatcher = new NetworkDispatcher(networkManager);
@@ -234,6 +264,7 @@ public class ReplayHandler {
//$$ channel.pipeline().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher);
//$$ channel.pipeline().fireChannelActive();
//#endif
//#endif
//#else
//$$ NetworkManager networkManager = new NetworkManager(true) {
//$$ @Override
@@ -520,12 +551,7 @@ public class ReplayHandler {
// Update all entity positions (especially prev/lastTick values)
for (Entity entity : loadedEntityList(world(mc))) {
if (entity instanceof EntityOtherPlayerMP) {
EntityOtherPlayerMP e = (EntityOtherPlayerMP) entity;
e.setPosition(e.otherPlayerMPX, e.otherPlayerMPY, e.otherPlayerMPZ);
e.rotationYaw = (float) e.otherPlayerMPYaw;
e.rotationPitch = (float) e.otherPlayerMPPitch;
}
skipTeleportInterpolation(entity);
entity.lastTickPosX = entity.prevPosX = entity.posX;
entity.lastTickPosY = entity.prevPosY = entity.posY;
entity.lastTickPosZ = entity.prevPosZ = entity.posZ;
@@ -534,23 +560,22 @@ public class ReplayHandler {
}
// Run previous tick
try {
mc.runTick();
} catch (IOException e) {
throw new RuntimeException(e);
}
//#if MC>=11300
mc.runTick();
//#else
//$$ try {
//$$ mc.runTick();
//$$ } catch (IOException e) {
//$$ throw new RuntimeException(e);
//$$ }
//#endif
// Jump to target tick
quickReplaySender.sendPacketsTill(targetTime);
// Immediately apply player teleport interpolation
for (Entity entity : loadedEntityList(world(mc))) {
if (entity instanceof EntityOtherPlayerMP) {
EntityOtherPlayerMP e = (EntityOtherPlayerMP) entity;
e.setPosition(e.otherPlayerMPX, e.otherPlayerMPY, e.otherPlayerMPZ);
e.rotationYaw = (float) e.otherPlayerMPYaw;
e.rotationPitch = (float) e.otherPlayerMPPitch;
}
skipTeleportInterpolation(entity);
}
return;
}
@@ -583,7 +608,11 @@ public class ReplayHandler {
// Render our please-wait-screen
GuiScreen guiScreen = new GuiScreen() {
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
//#if MC>=11300
public void render(int mouseX, int mouseY, float partialTicks) {
//#else
//$$ public void drawScreen(int mouseX, int mouseY, float partialTicks) {
//#endif
drawBackground(0);
drawCenteredString(getFontRenderer(mc), I18n.format("replaymod.gui.pleasewait"),
width / 2, height / 2, 0xffffffff);
@@ -598,47 +627,68 @@ public class ReplayHandler {
clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
enableTexture2D();
mc.getFramebuffer().bindFramebuffer(true);
mc.entityRenderer.setupOverlayRendering();
//#if MC>=11300
mc.mainWindow.setupOverlayRendering();
//#else
//$$ mc.entityRenderer.setupOverlayRendering();
//#endif
ScaledResolution resolution = newScaledResolution(mc);
//#if MC>=11300
MainWindow
//#else
//$$ ScaledResolution
//#endif
resolution = newScaledResolution(mc);
guiScreen.setWorldAndResolution(mc, resolution.getScaledWidth(), resolution.getScaledHeight());
guiScreen.drawScreen(0, 0, 0);
//#if MC>=11300
guiScreen.render(0, 0, 0);
//#else
//$$ guiScreen.drawScreen(0, 0, 0);
//#endif
mc.getFramebuffer().unbindFramebuffer();
popMatrix();
pushMatrix();
mc.getFramebuffer().framebufferRender(mc.displayWidth, mc.displayHeight);
//#if MC>=11300
mc.getFramebuffer().framebufferRender(mc.mainWindow.getFramebufferWidth(), mc.mainWindow.getFramebufferHeight());
//#else
//$$ mc.getFramebuffer().framebufferRender(mc.displayWidth, mc.displayHeight);
//#endif
popMatrix();
Display.update();
//#if MC>=11300
mc.mainWindow.update(true);
//#else
//$$ Display.update();
//#endif
// Send the packets
replaySender.sendPacketsTill(targetTime);
replaySender.setAsyncMode(true);
replaySender.setReplaySpeed(0);
getConnection(mc).getNetworkManager().processReceivedPackets();
getConnection(mc).getNetworkManager()
//#if MC>=11300
.tick();
//#else
//$$ .processReceivedPackets();
//#endif
for (Entity entity : loadedEntityList(world(mc))) {
if (entity instanceof EntityOtherPlayerMP) {
EntityOtherPlayerMP e = (EntityOtherPlayerMP) entity;
e.setPosition(e.otherPlayerMPX, e.otherPlayerMPY, e.otherPlayerMPZ);
e.rotationYaw = (float) e.otherPlayerMPYaw;
e.rotationPitch = (float) e.otherPlayerMPPitch;
}
skipTeleportInterpolation(entity);
entity.lastTickPosX = entity.prevPosX = entity.posX;
entity.lastTickPosY = entity.prevPosY = entity.posY;
entity.lastTickPosZ = entity.prevPosZ = entity.posZ;
entity.prevRotationYaw = entity.rotationYaw;
entity.prevRotationPitch = entity.rotationPitch;
}
//#if MC>=10800
try {
mc.runTick();
} catch (IOException e) {
e.printStackTrace(); // This should never be thrown but whatever
}
//#if MC>=10800 && MC<11300
//$$ try {
//$$ mc.runTick();
//$$ } catch (IOException e) {
//$$ e.printStackTrace(); // This should never be thrown but whatever
//$$ }
//#else
//$$ mc.runTick();
mc.runTick();
//#endif
//finally, updating the camera's position (which is not done by the sync jumping)
@@ -649,4 +699,23 @@ public class ReplayHandler {
}
}
}
private void skipTeleportInterpolation(Entity entity) {
//#if MC>=11300
if (entity instanceof EntityLivingBase) {
EntityLivingBase e = (EntityLivingBase) entity;
// FIXME
// e.setPosition(e.otherPlayerMPX, e.otherPlayerMPY, e.otherPlayerMPZ);
// e.rotationYaw = (float) e.otherPlayerMPYaw;
// e.rotationPitch = (float) e.otherPlayerMPPitch;
}
//#else
//$$ if (entity instanceof EntityOtherPlayerMP) {
//$$ EntityOtherPlayerMP e = (EntityOtherPlayerMP) entity;
//$$ e.setPosition(e.otherPlayerMPX, e.otherPlayerMPY, e.otherPlayerMPZ);
//$$ e.rotationYaw = (float) e.otherPlayerMPYaw;
//$$ e.rotationPitch = (float) e.otherPlayerMPPitch;
//$$ }
//#endif
}
}

View File

@@ -6,6 +6,7 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.core.ReplayMod;
import com.replaymod.core.utils.ModCompat;
import com.replaymod.core.versions.MCVer;
import com.replaymod.replay.camera.CameraController;
import com.replaymod.replay.camera.CameraControllerRegistry;
import com.replaymod.replay.camera.CameraEntity;
@@ -19,16 +20,20 @@ import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.replay.ZipReplayFile;
import com.replaymod.replaystudio.studio.ReplayStudio;
import net.minecraft.client.Minecraft;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
//#if MC>=11300
import com.replaymod.core.versions.MCVer.Keyboard;
//#else
//$$ import org.lwjgl.input.Keyboard;
//#endif
//#if MC>=10800
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
//#else
//$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPostInitializationEvent;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
@@ -40,25 +45,16 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Optional;
@Mod(modid = ReplayModReplay.MOD_ID,
version = "@MOD_VERSION@",
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModReplay {
public static final String MOD_ID = "replaymod-replay";
public class ReplayModReplay extends ReplayMod.Module {
@Mod.Instance(MOD_ID)
{ instance = this; }
public static ReplayModReplay instance;
private ReplayMod core;
private final CameraControllerRegistry cameraControllerRegistry = new CameraControllerRegistry();
public static Logger LOGGER;
public static Logger LOGGER = LogManager.getLogger();
protected ReplayHandler replayHandler;
@@ -66,14 +62,15 @@ public class ReplayModReplay {
return replayHandler;
}
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
LOGGER = event.getModLog();
core = ReplayMod.instance;
public ReplayModReplay(ReplayMod core) {
this.core = core;
}
@Override
public void preInit(FMLPreInitializationEvent event) {
core.getSettingsRegistry().register(Setting.class);
core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.marker", Keyboard.KEY_M, new Runnable() {
core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.marker", MCVer.Keyboard.KEY_M, new Runnable() {
@Override
public void run() {
if (replayHandler != null ) {
@@ -109,7 +106,7 @@ public class ReplayModReplay {
@Override
public void run() {
if (replayHandler != null) {
Minecraft mc = Minecraft.getMinecraft();
Minecraft mc = MCVer.getMinecraft();
ListenableFuture<NoGuiScreenshot> future = NoGuiScreenshot.take(mc, 1280, 720);
Futures.addCallback(future, new FutureCallback<NoGuiScreenshot>() {
@Override
@@ -181,15 +178,15 @@ public class ReplayModReplay {
});
}
@Mod.EventHandler
@Override
public void init(FMLInitializationEvent event) {
Minecraft mc = core.getMinecraft();
mc.timer = new InputReplayTimer(mc.timer, this);
// FIXME mc.timer = new InputReplayTimer(mc.timer, this);
new GuiHandler(this).register();
}
@Mod.EventHandler
@Override
public void postInit(FMLPostInitializationEvent event) {
Setting.CAMERA.setChoices(new ArrayList<>(cameraControllerRegistry.getControllers()));
}

View File

@@ -2,6 +2,8 @@ package com.replaymod.replay;
import net.minecraft.client.Minecraft;
import static com.replaymod.core.versions.MCVer.getMinecraft;
public interface ReplaySender {
int currentTimeStamp();
@@ -10,7 +12,7 @@ public interface ReplaySender {
* @return {@code true} if it is paused, {@code false} otherwise
*/
public default boolean paused() {
Minecraft mc = Minecraft.getMinecraft();
Minecraft mc = getMinecraft();
//#if MC>=11200
return mc.timer.tickLength == Float.POSITIVE_INFINITY;
//#else

View File

@@ -3,6 +3,7 @@ package com.replaymod.replay.camera;
import com.replaymod.core.ReplayMod;
import com.replaymod.core.events.SettingsChangedEvent;
import com.replaymod.core.utils.Utils;
import com.replaymod.core.versions.MCVer;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.Setting;
import com.replaymod.replay.events.ReplayChatMessageEvent;
@@ -26,10 +27,18 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.common.MinecraftForge;
//#if MC>=11300
import net.minecraft.util.math.RayTraceFluidMode;
//#endif
//#if MC>=10904
import net.minecraft.inventory.EntityEquipmentSlot;
//#if MC>=11200
import net.minecraft.stats.RecipeBook;
//#if MC>=11300
import net.minecraft.client.util.RecipeBookClient;
//#else
//$$ import net.minecraft.stats.RecipeBook;
//#endif
//#endif
import net.minecraft.stats.StatisticsManager;
import net.minecraft.util.EnumHand;
@@ -45,9 +54,14 @@ import net.minecraft.util.text.ITextComponent;
//#if MC>=10800
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
//#if MC>=11300
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.EventPriority;
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.EventPriority;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
@@ -97,9 +111,13 @@ public class CameraEntity
*/
private final EventHandler eventHandler = new EventHandler();
//#if MC>=11300
public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager, RecipeBookClient recipeBookClient) {
super(mcIn, worldIn, netHandlerPlayClient, statisticsManager, recipeBookClient);
//#else
//#if MC>=11200
public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager, RecipeBook recipeBook) {
super(mcIn, worldIn, netHandlerPlayClient, statisticsManager, recipeBook);
//$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager, RecipeBook recipeBook) {
//$$ super(mcIn, worldIn, netHandlerPlayClient, statisticsManager, recipeBook);
//#else
//#if MC>=10904
//$$ public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager) {
@@ -113,6 +131,7 @@ public class CameraEntity
//$$ super(mcIn, worldIn, session, netHandlerPlayClient, statFileWriter);
//#endif
//#endif
//#endif
//#endif
FORGE_BUS.register(eventHandler);
FML_BUS.register(eventHandler);
@@ -196,7 +215,11 @@ public class CameraEntity
private void updateBoundingBox() {
//#if MC>=10800
setEntityBoundingBox(new AxisAlignedBB(
//#if MC>=11300
setBoundingBox(new AxisAlignedBB(
//#else
//$$ setEntityBoundingBox(new AxisAlignedBB(
//#endif
//#else
//$$ this.boundingBox.setBB(AxisAlignedBB.getBoundingBox(
//#endif
@@ -205,7 +228,11 @@ public class CameraEntity
}
@Override
public void onUpdate() {
//#if MC>=11300
public void tick() {
//#else
//$$ public void onUpdate() {
//#endif
//#if MC>=10800
Entity view = getRenderViewEntity(mc);
//#else
@@ -262,10 +289,12 @@ public class CameraEntity
return falseUnlessSpectating(Entity::isEntityInsideOpaqueBlock); // Make sure no suffocation overlay is rendered
}
/* FIXME
@Override
public boolean isInsideOfMaterial(Material materialIn) {
return falseUnlessSpectating(e -> e.isInsideOfMaterial(materialIn)); // Make sure no overlays are rendered
}
*/
//#if MC>=10800
@Override
@@ -405,19 +434,33 @@ public class CameraEntity
return super.isHandActive();
}
//#if MC>=11300
@Override
public RayTraceResult rayTrace(double p_174822_1_, float p_174822_3_) {
RayTraceResult pos = super.rayTrace(p_174822_1_, 1f);
public RayTraceResult rayTrace(double blockReachDistance, float partialTicks, RayTraceFluidMode p_174822_4_) {
RayTraceResult pos = super.rayTrace(blockReachDistance, partialTicks, p_174822_4_);
// Make sure we can never look at blocks (-> no outline)
if(pos != null && pos.typeOfHit == RayTraceResult.Type.BLOCK) {
pos.typeOfHit = RayTraceResult.Type.MISS;
if(pos != null && pos.type == RayTraceResult.Type.BLOCK) {
pos.type = RayTraceResult.Type.MISS;
}
return pos;
}
//#else
//$$ @Override
//$$ public RayTraceResult rayTrace(double p_174822_1_, float p_174822_3_) {
//$$ RayTraceResult pos = super.rayTrace(p_174822_1_, 1f);
//$$
//$$ // Make sure we can never look at blocks (-> no outline)
//$$ if(pos != null && pos.typeOfHit == RayTraceResult.Type.BLOCK) {
//$$ pos.typeOfHit = RayTraceResult.Type.MISS;
//$$ }
//$$
//$$ return pos;
//$$ }
//#endif
//#else
//$$ @Override
//$$ public MovingObjectPosition rayTrace(double p_174822_1_, float p_174822_3_) {
//$$ MovingObjectPosition pos = super.rayTrace(p_174822_1_, 1f);
//$$
@@ -430,15 +473,22 @@ public class CameraEntity
//$$ }
//#endif
/* FIXME
@Override
public void openGui(Object mod, int modGuiId, World world, int x, int y, int z) {
// Do not open any block GUIs for the camera entities
// Note: Vanilla GUIs are filtered out on a packet level, this only applies to mod GUIs
}
*/
@Override
public void setDead() {
super.setDead();
//#if MC>=11300
public void remove() {
super.remove();
//#else
//$$ public void setDead() {
//$$ super.setDead();
//#endif
FORGE_BUS.unregister(eventHandler);
FML_BUS.unregister(eventHandler);
}
@@ -530,11 +580,11 @@ public class CameraEntity
@SubscribeEvent
public void preCrosshairRender(RenderGameOverlayEvent.Pre event) {
// The crosshair should only render if targeted entity can actually be spectated
if (getType(event) == RenderGameOverlayEvent.ElementType.CROSSHAIRS) {
if (MCVer.getType(event) == RenderGameOverlayEvent.ElementType.CROSSHAIRS) {
event.setCanceled(!canSpectate(mc.pointedEntity));
}
// Hotbar should never be rendered
if (getType(event) == RenderGameOverlayEvent.ElementType.HOTBAR) {
if (MCVer.getType(event) == RenderGameOverlayEvent.ElementType.HOTBAR) {
event.setCanceled(true);
}
}
@@ -568,12 +618,14 @@ public class CameraEntity
lastHandRendered = player;
//#if MC>=10904
/* FIXME needs AT
mc.entityRenderer.itemRenderer.prevEquippedProgressMainHand = 1;
mc.entityRenderer.itemRenderer.prevEquippedProgressOffHand = 1;
mc.entityRenderer.itemRenderer.equippedProgressMainHand = 1;
mc.entityRenderer.itemRenderer.equippedProgressOffHand = 1;
mc.entityRenderer.itemRenderer.itemStackMainHand = player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
mc.entityRenderer.itemRenderer.itemStackOffHand = player.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND);
*/
//#else
//$$ mc.entityRenderer.itemRenderer.prevEquippedProgress = 1;
//$$ mc.entityRenderer.itemRenderer.equippedProgress = 1;
@@ -605,7 +657,7 @@ public class CameraEntity
@SubscribeEvent
public void preRenderGameOverlay(RenderGameOverlayEvent.Pre event) {
switch (getType(event)) {
switch (MCVer.getType(event)) {
case ALL:
heldItemTooltipsWasTrue = mc.gameSettings.heldItemTooltips;
mc.gameSettings.heldItemTooltips = false;
@@ -641,7 +693,7 @@ public class CameraEntity
@SubscribeEvent
public void postRenderGameOverlay(RenderGameOverlayEvent.Post event) {
if (getType(event) != RenderGameOverlayEvent.ElementType.ALL) return;
if (MCVer.getType(event) != RenderGameOverlayEvent.ElementType.ALL) return;
mc.gameSettings.heldItemTooltips = heldItemTooltipsWasTrue;
}
}

View File

@@ -1,9 +1,8 @@
package com.replaymod.replay.camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import org.lwjgl.Sys;
import org.lwjgl.util.vector.Vector3f;
import javax.vecmath.Vector3f;
import static com.replaymod.core.versions.MCVer.*;
@@ -22,7 +21,7 @@ public class ClassicCameraController implements CameraController {
private Vector3f direction;
private Vector3f dirBefore;
private double motion;
private long lastCall = Sys.getTime();
private long lastCall = System.currentTimeMillis();
private boolean speedup = false;
@@ -34,7 +33,7 @@ public class ClassicCameraController implements CameraController {
public void update(float partialTicksPassed) {
boolean forward = false, backward = false, left = false, right = false, up = false, down = false;
speedup = false;
for(KeyBinding kb : Minecraft.getMinecraft().gameSettings.keyBindings) {
for(KeyBinding kb : getMinecraft().gameSettings.keyBindings) {
if(!isKeyDown(kb)) continue;
if(kb.getKeyDescription().equals("key.forward")) {
forward = true;
@@ -109,7 +108,7 @@ public class ClassicCameraController implements CameraController {
}
private void updateMovement() {
long frac = Sys.getTime() - lastCall;
long frac = System.currentTimeMillis() - lastCall;
if(frac == 0) return;
@@ -124,13 +123,14 @@ public class ClassicCameraController implements CameraController {
motion = Math.min(motion, MAX_SPEED);
lastCall = Sys.getTime();
lastCall = System.currentTimeMillis();
if(direction == null || direction.lengthSquared() == 0 || motion < THRESHOLD) {
return;
}
Vector3f movement = direction.normalise(null);
Vector3f movement = new Vector3f(direction);
movement.normalize();
double factor = motion * (frac / 1000D);
camera.moveCamera(movement.x * factor, movement.y * factor, movement.z * factor);
@@ -162,7 +162,9 @@ public class ClassicCameraController implements CameraController {
Vector3f dbf = direction;
if(dirBefore != null) {
direction = Vector3f.add(direction, dirBefore.normalise(null), null);
dirBefore.normalize();
dirBefore.add(direction);
direction = dirBefore;
}
dirBefore = dbf;

View File

@@ -6,7 +6,12 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import org.lwjgl.input.Mouse;
//#if MC>=11300
// FIXME
//#else
//$$ import org.lwjgl.input.Mouse;
//#endif
import java.util.Arrays;
@@ -18,7 +23,7 @@ public class SpectatorCameraController implements CameraController {
@Override
public void update(float partialTicksPassed) {
Minecraft mc = Minecraft.getMinecraft();
Minecraft mc = getMinecraft();
if (mc.gameSettings.keyBindSneak.isPressed()) {
ReplayModReplay.instance.getReplayHandler().spectateCamera();
}
@@ -31,7 +36,11 @@ public class SpectatorCameraController implements CameraController {
}
// Prevent mouse movement
Mouse.updateCursor();
//#if MC>=11300
// FIXME
//#else
//$$ Mouse.updateCursor();
//#endif
// Always make sure the camera is in the exact same spot as the spectated entity
// This is necessary as some rendering code for the hand doesn't respect the view entity

View File

@@ -1,9 +1,15 @@
package com.replaymod.replay.camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.client.settings.KeyBinding;
import org.lwjgl.util.vector.Vector3f;
//#if MC>=11300
import net.minecraft.client.GameSettings;
//#else
//$$ import net.minecraft.client.settings.GameSettings;
//#endif
import javax.vecmath.Vector3f;
import static com.replaymod.core.versions.MCVer.*;
@@ -42,11 +48,11 @@ public class VanillaCameraController implements CameraController {
Vector3f direction = new Vector3f(0, 0, 0);
for (int i = 0; i < 6; i++) { // First, get movement direction depending on keys pressed
if (isKeyDown(bindings[i])) {
Vector3f.add(direction, DIRECTIONS[i], direction);
direction.add(DIRECTIONS[i]);
}
}
if (direction.length() == 0) return;
direction.normalise(direction); // Normalize, so we don't move quicker if we hold down multiple keys
direction.normalize(); // Normalize, so we don't move quicker if we hold down multiple keys
double yawRadians = Math.toRadians(camera.rotationYaw);
float yawSin = (float) Math.sin(yawRadians), yawCos = (float) Math.cos(yawRadians);
// Rotate by yaw

View File

@@ -5,8 +5,13 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Cancelable;
import net.minecraftforge.fml.common.eventhandler.Event;
//#if MC>=11300
import net.minecraftforge.eventbus.api.Cancelable;
import net.minecraftforge.eventbus.api.Event;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.Cancelable;
//$$ import net.minecraftforge.fml.common.eventhandler.Event;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.Cancelable;
//$$ import cpw.mods.fml.common.eventhandler.Event;

View File

@@ -5,7 +5,11 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event;
//#if MC>=11300
import net.minecraftforge.eventbus.api.Event;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.Event;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif

View File

@@ -1,8 +1,13 @@
package com.replaymod.replay.events;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Cancelable;
import net.minecraftforge.fml.common.eventhandler.Event;
//#if MC>=11300
import net.minecraftforge.eventbus.api.Cancelable;
import net.minecraftforge.eventbus.api.Event;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.Cancelable;
//$$ import net.minecraftforge.fml.common.eventhandler.Event;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.Cancelable;
//$$ import cpw.mods.fml.common.eventhandler.Event;

View File

@@ -5,7 +5,11 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event;
//#if MC>=11300
import net.minecraftforge.eventbus.api.Event;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.Event;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif

View File

@@ -12,8 +12,13 @@ import de.johni0702.minecraft.gui.layout.VerticalLayout;
import de.johni0702.minecraft.gui.popup.AbstractGuiPopup;
import de.johni0702.minecraft.gui.utils.Colors;
import com.replaymod.replaystudio.data.Marker;
import org.lwjgl.input.Keyboard;
import org.lwjgl.util.ReadablePoint;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint;
//#if MC>=11300
import com.replaymod.core.versions.MCVer.Keyboard;
//#else
//$$ import org.lwjgl.input.Keyboard;
//#endif
public class GuiEditMarkerPopup extends AbstractGuiPopup<GuiEditMarkerPopup> implements Typeable {
private static GuiNumberField newGuiNumberField() {

View File

@@ -8,10 +8,10 @@ import de.johni0702.minecraft.gui.GuiRenderer;
import de.johni0702.minecraft.gui.RenderInfo;
import de.johni0702.minecraft.gui.element.advanced.AbstractGuiTimeline;
import de.johni0702.minecraft.gui.function.Draggable;
import de.johni0702.minecraft.gui.utils.lwjgl.Point;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint;
import net.minecraft.client.resources.I18n;
import org.lwjgl.util.Point;
import org.lwjgl.util.ReadableDimension;
import org.lwjgl.util.ReadablePoint;
import static de.johni0702.minecraft.gui.utils.Utils.clamp;

View File

@@ -14,15 +14,24 @@ import de.johni0702.minecraft.gui.element.GuiTooltip;
import de.johni0702.minecraft.gui.element.advanced.IGuiTimeline;
import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint;
import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint;
import net.minecraft.client.resources.I18n;
import net.minecraft.client.settings.GameSettings;
import org.lwjgl.input.Keyboard;
import org.lwjgl.util.ReadableDimension;
import org.lwjgl.util.ReadablePoint;
import org.lwjgl.util.WritablePoint;
//#if MC>=11300
import net.minecraft.client.GameSettings;
//#else
//$$ import net.minecraft.client.settings.GameSettings;
//$$ import org.lwjgl.input.Keyboard;
//#endif
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#if MC>=11300
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
import net.minecraftforge.fml.common.gameevent.InputEvent;
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
@@ -160,12 +169,14 @@ public class GuiReplayOverlay extends AbstractGuiOverlay<GuiReplayOverlay> {
setMouseVisible(true);
}
}
/* FIXME
if (Keyboard.getEventKeyState()) {
// Handle the F1 key binding while the overlay is opened as a gui screen
if (isMouseVisible() && Keyboard.getEventKey() == Keyboard.KEY_F1) {
gameSettings.hideGUI = !gameSettings.hideGUI;
}
}
*/
}
@Override

View File

@@ -10,6 +10,7 @@ import com.replaymod.core.ReplayMod;
import com.replaymod.core.SettingsRegistry;
import com.replaymod.core.gui.GuiReplaySettings;
import com.replaymod.core.utils.Utils;
import com.replaymod.core.versions.MCVer;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.Setting;
import com.replaymod.replaystudio.replay.ReplayFile;
@@ -31,24 +32,24 @@ import de.johni0702.minecraft.gui.popup.AbstractGuiPopup;
import de.johni0702.minecraft.gui.popup.GuiYesNoPopup;
import de.johni0702.minecraft.gui.utils.Colors;
import de.johni0702.minecraft.gui.utils.Consumer;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint;
import lombok.Getter;
import net.minecraft.client.gui.GuiErrorScreen;
import net.minecraft.client.resources.I18n;
import net.minecraft.crash.CrashReport;
import net.minecraft.util.ReportedException;
import net.minecraft.util.Util;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension;
import org.lwjgl.util.ReadablePoint;
import java.awt.*;
//#if MC>=11300
import com.replaymod.core.versions.MCVer.Keyboard;
//#else
//$$ import org.lwjgl.input.Keyboard;
//#endif
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
@@ -57,6 +58,7 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import static com.replaymod.replay.ReplayModReplay.LOGGER;
import static com.replaymod.core.versions.MCVer.*;
public class GuiReplayViewer extends GuiScreen {
private final ReplayModReplay mod;
@@ -93,29 +95,8 @@ public class GuiReplayViewer extends GuiScreen {
public void run() {
try {
File folder = mod.getCore().getReplayFolder();
String path = folder.getAbsolutePath();
// First try OS specific methods
try {
switch (Util.getOSType()) {
case WINDOWS:
Runtime.getRuntime().exec(String.format("cmd.exe /C start \"Open file\" \"%s\"", path));
return;
case OSX:
Runtime.getRuntime().exec(new String[]{"/usr/bin/open", path});
return;
}
} catch (IOException e) {
LogManager.getLogger().error("Cannot open file", e);
}
// Otherwise try to java way
try {
Desktop.getDesktop().browse(folder.toURI());
} catch (Throwable throwable) {
// And if all fails, lwjgl
Sys.openURL("file://" + path);
}
MCVer.openFile(folder);
} catch (IOException e) {
mod.getLogger().error("Cannot open file", e);
}
@@ -232,7 +213,7 @@ public class GuiReplayViewer extends GuiScreen {
try {
list.setFolder(mod.getCore().getReplayFolder());
} catch (IOException e) {
throw new ReportedException(CrashReport.makeCrashReport(e, "Getting replay folder"));
throw newReportedException(CrashReport.makeCrashReport(e, "Getting replay folder"));
}
setTitle(new GuiLabel().setI18nText("replaymod.gui.replayviewer"));

View File

@@ -1,5 +1,6 @@
package com.replaymod.replay.handler;
import com.replaymod.core.versions.MCVer;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.gui.screen.GuiReplayViewer;
import net.minecraft.client.Minecraft;
@@ -11,7 +12,11 @@ import net.minecraft.client.resources.I18n;
import net.minecraftforge.client.event.GuiScreenEvent;
//#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#if MC>=11300
import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#else
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif
@@ -32,7 +37,7 @@ public class GuiHandler {
private static final int BUTTON_REPLAY_VIEWER = 17890234;
private static final int BUTTON_EXIT_REPLAY = 17890235;
private static final Minecraft mc = Minecraft.getMinecraft();
private static final Minecraft mc = MCVer.getMinecraft();
private final ReplayModReplay mod;
@@ -130,7 +135,7 @@ public class GuiHandler {
return;
}
GuiButton button = new GuiButton(BUTTON_REPLAY_VIEWER, getGui(event).width / 2 - 100,
getGui(event).height / 4 + 10 + 3 * 24, I18n.format("replaymod.gui.replayviewer"));
getGui(event).height / 4 + 10 + 3 * 24, I18n.format("replaymod.gui.replayviewer")){};
button.width = button.width / 2 - 2;
getButtonList(event).add(button);
}

View File

@@ -2,7 +2,6 @@
package com.replaymod.replay.mixin;
import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiSpectator;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@@ -20,7 +19,7 @@ public abstract class MixinGuiSpectator {
//#endif
public void isInReplay(int i, CallbackInfo ci) {
// Prevent spectator gui from opening while in a replay
if (player(Minecraft.getMinecraft()) instanceof CameraEntity) {
if (player(getMinecraft()) instanceof CameraEntity) {
ci.cancel();
}
}

View File

@@ -15,7 +15,11 @@ import java.util.Queue;
@Mixin(ParticleManager.class)
public abstract class MixinParticleManager {
@Shadow
private Queue<Particle> queueEntityFX;
//#if MC>=11300
private Queue<Particle> queue;
//#else
//$$ private Queue<Particle> queueEntityFX;
//#endif
/**
* This method additionally clears the queue of particles to be added when the world is changed.
@@ -27,7 +31,11 @@ public abstract class MixinParticleManager {
*/
@Inject(method = "clearEffects", at = @At("HEAD"))
public void replayModReplay_clearParticleQueue(World world, CallbackInfo ci) {
queueEntityFX.clear();
//#if MC>=11300
queue.clear();
//#else
//$$ queueEntityFX.clear();
//#endif
}
}
//#endif

View File

@@ -13,7 +13,11 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
//#if MC>=11200
import net.minecraft.stats.RecipeBook;
//#if MC>=11300
import net.minecraft.client.util.RecipeBookClient;
//#else
//$$ import net.minecraft.stats.RecipeBook;
//#endif
//#endif
//#if MC>=10904
import net.minecraft.stats.StatisticsManager;
@@ -44,10 +48,16 @@ public abstract class MixinPlayerControllerMP {
//#endif
//#if MC>=11200
@Inject(method = "func_192830_a", at=@At("HEAD"), cancellable = true)
private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, RecipeBook recipeBook, CallbackInfoReturnable<EntityPlayerSP> ci) {
@Inject(method = "createPlayer", at=@At("HEAD"), cancellable = true)
private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, RecipeBookClient recipeBookClient, CallbackInfoReturnable<EntityPlayerSP> ci) {
if (ReplayModReplay.instance.getReplayHandler() != null) {
ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager, recipeBook));
ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager, recipeBookClient));
//#else
//#if MC>=11200
//$$ @Inject(method = "func_192830_a", at=@At("HEAD"), cancellable = true)
//$$ private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, RecipeBook recipeBook, CallbackInfoReturnable<EntityPlayerSP> ci) {
//$$ if (ReplayModReplay.instance.getReplayHandler() != null) {
//$$ ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager, recipeBook));
//#else
//#if MC>=10904
//$$ @Inject(method = "createClientPlayer", at=@At("HEAD"), cancellable = true)
@@ -67,13 +77,18 @@ public abstract class MixinPlayerControllerMP {
//$$ ci.setReturnValue(new CameraEntity(mc, worldIn, mc.getSession(), netClientHandler, statFileWriter));
//#endif
//#endif
//#endif
//#endif
ci.cancel();
}
}
//#if MC>=10800
@Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true)
//#if MC>=11300
@Inject(method = "isSpectatorMode", at=@At("HEAD"), cancellable = true)
//#else
//$$ @Inject(method = "isSpectator", at=@At("HEAD"), cancellable = true)
//#endif
private void replayModReplay_isSpectator(CallbackInfoReturnable<Boolean> ci) {
if (player(mc) instanceof CameraEntity) { // this check should in theory not be required
ci.setReturnValue(player(mc).isSpectator());

View File

@@ -2,25 +2,42 @@ package com.replaymod.replay.mixin;
import com.replaymod.replay.ReplayHandler;
import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
//#if MC>=11300
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.util.Util;
//#else
//$$ import net.minecraft.client.Minecraft;
//#if MC>=10904
import net.minecraft.client.renderer.RenderItem;
//$$ import net.minecraft.client.renderer.RenderItem;
//#else
//$$ import net.minecraft.client.renderer.entity.RenderItem;
//#endif
//#endif
@Mixin(RenderItem.class)
//#if MC>=11300
@Mixin(ItemRenderer.class)
//#else
//$$ @Mixin(RenderItem.class)
//#endif
public class MixinRenderItem {
@Redirect(method = "renderEffect", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
private long getEnchantmentTime() {
//#if MC>=11300
@Redirect(method = "renderEffect", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;milliTime()J"))
//#else
//$$ @Redirect(method = "renderEffect", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
//#endif
private static long getEnchantmentTime() {
ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler();
if (replayHandler != null) {
return replayHandler.getReplaySender().currentTimeStamp();
}
return Minecraft.getSystemTime();
//#if MC>=11300
return Util.milliTime();
//#else
//$$ return Minecraft.getSystemTime();
//#endif
}
}

View File

@@ -1,7 +1,6 @@
package com.replaymod.replay.mixin;
import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import org.spongepowered.asm.mixin.Mixin;
@@ -26,7 +25,7 @@ import static com.replaymod.core.versions.MCVer.*;
public abstract class MixinRenderLivingBase {
@Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true)
private void replayModReplay_canRenderInvisibleName(EntityLivingBase entity, CallbackInfoReturnable<Boolean> ci) {
EntityPlayer thePlayer = player(Minecraft.getMinecraft());
EntityPlayer thePlayer = player(getMinecraft());
if (thePlayer instanceof CameraEntity && entity.isInvisible()) {
ci.setReturnValue(false);
}

View File

@@ -3,7 +3,6 @@ package com.replaymod.replay.mixin;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.Entity;
import net.minecraft.entity.passive.EntityAnimal;
import net.minecraft.world.World;
@@ -13,6 +12,12 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11300
import net.minecraft.client.GameSettings;
//#else
//$$ import net.minecraft.client.settings.GameSettings;
//#endif
@Mixin(RenderManager.class)
public class MixinRenderManager {
@Shadow

View File

@@ -2,11 +2,16 @@ package com.replaymod.replay.mixin;
import com.replaymod.replay.ReplayHandler;
import com.replaymod.replay.ReplayModReplay;
import net.minecraft.client.Minecraft;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
//#if MC>=11300
import net.minecraft.util.Util;
//#else
import net.minecraft.client.Minecraft;
//#endif
//#if MC>=10800
import net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer;
//#else
@@ -19,8 +24,11 @@ import net.minecraft.client.renderer.tileentity.TileEntityEndPortalRenderer;
//$$ @Mixin(RenderEndPortal.class)
//#endif
public class MixinTileEntityEndPortalRenderer {
//#if MC>=11300
@Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;milliTime()J"))
//#else
//#if MC>=10809
@Redirect(method = "renderTileEntityAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
//$$ @Redirect(method = "renderTileEntityAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
//#else
//#if MC>=10800
//$$ @Redirect(method = "func_180544_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
@@ -28,11 +36,16 @@ public class MixinTileEntityEndPortalRenderer {
//$$ @Redirect(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntityEndPortal;DDDF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J"))
//#endif
//#endif
private long replayModReplay_getEnchantmentTime() {
//#endif
private static long replayModReplay_getEnchantmentTime() {
ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler();
if (replayHandler != null) {
return replayHandler.getReplaySender().currentTimeStamp();
}
return Minecraft.getSystemTime();
//#if MC>=11300
return Util.milliTime();
//#else
//$$ return Minecraft.getSystemTime();
//#endif
}
}

View File

@@ -273,7 +273,6 @@ sourceSets {
exclude 'com/replaymod/online'
exclude 'com/replaymod/pathing'
exclude 'com/replaymod/render'
exclude 'com/replaymod/replay'
exclude 'com/replaymod/restrictions'
exclude 'com/replaymod/simplepathing'
}