diff --git a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java index ff74d672..0b0d796a 100644 --- a/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java +++ b/src/main/java/eu/crushedpixel/replaymod/ReplayMod.java @@ -1,5 +1,7 @@ package eu.crushedpixel.replaymod; +import java.io.File; + import net.minecraft.client.Minecraft; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; @@ -12,11 +14,11 @@ import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import eu.crushedpixel.replaymod.api.client.ApiClient; +import eu.crushedpixel.replaymod.editor.ReplayTrimmer; import eu.crushedpixel.replaymod.events.GuiEventHandler; import eu.crushedpixel.replaymod.events.GuiReplayOverlay; import eu.crushedpixel.replaymod.events.KeyInputHandler; import eu.crushedpixel.replaymod.events.RecordingHandler; -import eu.crushedpixel.replaymod.online.authentication.AuthenticationHandler; import eu.crushedpixel.replaymod.recording.ConnectionEventHandler; import eu.crushedpixel.replaymod.registry.KeybindRegistry; import eu.crushedpixel.replaymod.renderer.SafeEntityRenderer; @@ -106,6 +108,7 @@ public class ReplayMod e.printStackTrace(); } + //ReplayTrimmer.trim(new File("/Users/mariusmetzger/toTrim.mcpr"), new File("/Users/mariusmetzger/trimmed.mcpr"), 1000*60, 2000*60); //if(AuthenticationHandler.isBlacklisted(Minecraft.getMinecraft().getSession().getPlayerID())) { //System.exit(0); //} diff --git a/src/main/java/eu/crushedpixel/replaymod/entities/CameraEntity.java b/src/main/java/eu/crushedpixel/replaymod/entities/CameraEntity.java index 698fa25e..562f0b76 100644 --- a/src/main/java/eu/crushedpixel/replaymod/entities/CameraEntity.java +++ b/src/main/java/eu/crushedpixel/replaymod/entities/CameraEntity.java @@ -109,14 +109,14 @@ public class CameraEntity extends EntityPlayer { } public void moveAbsolute(double x, double y, double z) { - if(ReplayHandler.isReplaying()) return; + if(ReplayHandler.isInPath()) return; this.lastTickPosX = this.prevPosX = this.posX = x; this.lastTickPosY = this.prevPosY = this.posY = y; this.lastTickPosZ = this.prevPosZ = this.posZ = z; } public void moveRelative(double x, double y, double z) { - if(ReplayHandler.isReplaying()) return; + if(ReplayHandler.isInPath()) return; this.lastTickPosX = this.prevPosX = this.posX = this.posX+x; this.lastTickPosY = this.prevPosY = this.posY = this.posY+y; this.lastTickPosZ = this.prevPosZ = this.posZ = this.posZ+z; diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java index 9178d2fc..a49342b9 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java @@ -82,13 +82,13 @@ public class GuiEventHandler { return; } if(event.gui instanceof GuiChat || event.gui instanceof GuiInventory) { - if(ReplayHandler.replayActive()) { + if(ReplayHandler.isInReplay()) { event.setCanceled(true); } } else if(event.gui instanceof GuiDisconnected) { - if(!ReplayHandler.replayActive() && System.currentTimeMillis() - ReplayHandler.lastExit < 5000) { + if(!ReplayHandler.isInReplay() && System.currentTimeMillis() - ReplayHandler.lastExit < 5000) { event.setCanceled(true); } } @@ -111,7 +111,7 @@ public class GuiEventHandler { @SubscribeEvent public void onInit(InitGuiEvent event) { - if(event.gui instanceof GuiIngameMenu && ReplayHandler.replayActive()) { + if(event.gui instanceof GuiIngameMenu && ReplayHandler.isInReplay()) { for(GuiButton b : new ArrayList(event.buttonList)) { if(b.id == 1) { b.displayString = "Exit Replay"; @@ -164,7 +164,7 @@ public class GuiEventHandler { mc.displayGuiScreen(new GuiReplaySettings(event.gui)); } - if(ReplayHandler.replayActive() && event.gui instanceof GuiIngameMenu && event.button.id == GuiConstants.EXIT_REPLAY_BUTTON) { + if(ReplayHandler.isInReplay() && event.gui instanceof GuiIngameMenu && event.button.id == GuiConstants.EXIT_REPLAY_BUTTON) { ReplayHandler.endReplay(); event.button.enabled = false; diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java index ec584c20..c20544e6 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java @@ -24,6 +24,7 @@ import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent.KeyInputEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; @@ -89,6 +90,17 @@ public class GuiReplayOverlay extends Gui { private boolean mouseDown = false; private static boolean requestScreenshot = false; + + private static Field isGamePaused; + + static { + try { + isGamePaused = Minecraft.class.getDeclaredField(MCPNames.field("field_71445_n")); + isGamePaused.setAccessible(true); + } catch(Exception e) { + e.printStackTrace(); + } + } //private Field drawBlockOutline; @@ -106,32 +118,41 @@ public class GuiReplayOverlay extends Gui { //@SubscribeEvent TODO public void renderHand(RenderHandEvent event) { - if(ReplayHandler.replayActive()) { + if(ReplayHandler.isInReplay()) { event.setCanceled(true); } } @SubscribeEvent public void tick(TickEvent event) { - if(!ReplayHandler.replayActive()) return; - if(ReplayHandler.isReplaying() && !ReplayProcess.isVideoRecording()) ReplayProcess.tickReplay(); + if(!ReplayHandler.isInReplay()) return; + if(ReplayHandler.isInPath() && !ReplayProcess.isVideoRecording()) ReplayProcess.tickReplay(); ReplayProcess.unblock(); if(ReplayHandler.getCameraEntity() != null) ReplayHandler.getCameraEntity().updateMovement(); - if(!ReplayHandler.isReplaying()) onMouseMove(new MouseEvent()); + if(!ReplayHandler.isInPath()) onMouseMove(new MouseEvent()); FMLCommonHandler.instance().bus().post(new InputEvent.KeyInputEvent()); + } private double lastX, lastY, lastZ; private float lastPitch, lastYaw; + + @SubscribeEvent + public void onChangeView(MouseEvent event) { + if(ReplayHandler.isInPath()) { + event.setCanceled(true); + } + } + @SubscribeEvent public void onRenderWorld(RenderWorldLastEvent event) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException { - if(!ReplayHandler.replayActive()) return; + if(!ReplayHandler.isInReplay()) return; if(ReplayHandler.isCamera()) ReplayHandler.setCameraEntity(ReplayHandler.getCameraEntity()); - if(ReplayHandler.replayActive() && ReplayHandler.isPaused()) { + if(ReplayHandler.isInReplay() && ReplayHandler.isPaused()) { if(mc != null && mc.thePlayer != null) MinecraftTicker.runMouseKeyboardTick(mc); } @@ -150,6 +171,9 @@ public class GuiReplayOverlay extends Gui { requestScreenshot = false; ReplayScreenshot.saveScreenshot(mc.getFramebuffer()); } + if(mc.isGamePaused() && ReplayHandler.isInPath()) { + isGamePaused.set(mc, false); + } } public void resetUI() throws Exception { @@ -171,7 +195,7 @@ public class GuiReplayOverlay extends Gui { @SubscribeEvent public void onRenderGui(RenderGameOverlayEvent.Post event) throws IllegalArgumentException, IllegalAccessException { - if(!ReplayHandler.replayActive() || FMLClientHandler.instance().isGUIOpen(GuiSpectateSelection.class) || VideoWriter.isRecording()) { + if(!ReplayHandler.isInReplay() || FMLClientHandler.instance().isGUIOpen(GuiSpectateSelection.class) || VideoWriter.isRecording()) { return; } @@ -189,7 +213,7 @@ public class GuiReplayOverlay extends Gui { GL11.glEnable(GL11.GL_BLEND); // drawBlockOutline.set(Minecraft.getMinecraft().entityRenderer, false); - if(!ReplayHandler.replayActive()) { + if(!ReplayHandler.isInReplay()) { return; } @@ -718,7 +742,7 @@ public class GuiReplayOverlay extends Gui { int dx = 0; int dy = 0; - boolean play = ReplayHandler.isReplaying(); + boolean play = ReplayHandler.isInPath(); hover = false; if(FMLClientHandler.instance().isGUIOpen(GuiMouseInput.class)) { @@ -742,7 +766,7 @@ public class GuiReplayOverlay extends Gui { //Handling the click on the Replay starter if(hover && Mouse.isButtonDown(0) && isClick() && FMLClientHandler.instance().isGUIOpen(GuiMouseInput.class)) { - if(ReplayHandler.isReplaying()) { + if(ReplayHandler.isInPath()) { ReplayHandler.interruptReplay(); } else { ReplayHandler.startPath(false); @@ -827,7 +851,7 @@ public class GuiReplayOverlay extends Gui { @SubscribeEvent public void onMouseMove(MouseEvent event) { - if(!ReplayHandler.replayActive()) return; + if(!ReplayHandler.isInReplay()) return; boolean flag = Display.isActive(); flag = true; diff --git a/src/main/java/eu/crushedpixel/replaymod/events/KeyInputHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/KeyInputHandler.java index a6249be7..599698ac 100644 --- a/src/main/java/eu/crushedpixel/replaymod/events/KeyInputHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/KeyInputHandler.java @@ -21,7 +21,7 @@ public class KeyInputHandler { @SubscribeEvent public void onKeyInput(KeyInputEvent event) { - if(!ReplayHandler.replayActive()) return; + if(!ReplayHandler.isInReplay()) return; if(mc.currentScreen != null) { return; } diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java b/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java index 16a4fa98..e88e677a 100644 --- a/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java @@ -24,6 +24,7 @@ import net.minecraft.client.renderer.ActiveRenderInfo; import com.google.gson.Gson; +import eu.crushedpixel.replaymod.editor.ReplayFileIO; import eu.crushedpixel.replaymod.gui.GuiReplaySaving; import eu.crushedpixel.replaymod.holders.PacketData; @@ -33,17 +34,17 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { protected Long startTime = null; protected String name; protected String worldName; - + private boolean singleplayer; - + protected long lastSentPacket = 0; protected boolean alive = true; - + protected DataWriter dataWriter; private Gson gson = new Gson(); - + protected Set players = new HashSet(); public void setWorldName(String worldName) { @@ -65,12 +66,12 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { DataOutputStream out = new DataOutputStream(bos); dataWriter = new DataWriter(out); } - + @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { dataWriter.requestFinish(players); } - + public class DataWriter { private boolean active = true; @@ -80,27 +81,24 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { public void writeData(PacketData data) { queue.add(data); } - + Thread outputThread = new Thread(new Runnable() { @Override public void run() { - + HashMap counts = new HashMap(); - + while(active) { PacketData dataReciever = queue.poll(); if(dataReciever != null) { //write the ByteBuf to the given OutputStream byte[] array = dataReciever.getByteArray(); - + if(array != null) { try { - stream.writeInt(dataReciever.getTimestamp()); //Timestamp - stream.writeInt(array.length); //Lenght - - stream.write(array); //Content + ReplayFileIO.writePacket(dataReciever, stream); stream.flush(); } catch(Exception e) { e.printStackTrace(); @@ -127,7 +125,7 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { for(Entry entries : counts.entrySet()) { System.out.println(entries.getKey()+ "| "+entries.getValue()); } - + } }); @@ -140,7 +138,6 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { public void requestFinish(Set players) { active = false; - byte[] buffer = new byte[1024]; try { GuiReplaySaving.replaySaving = true; @@ -150,9 +147,9 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { if(split.length > 0) { mcversion = split[0]; } - + String[] pl = players.toArray(new String[players.size()]); - + ReplayMetaData metaData = new ReplayMetaData(singleplayer, worldName, (int) lastSentPacket, startTime, pl, mcversion); String json = gson.toJson(metaData); @@ -162,29 +159,10 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { File archive = new File(folder, name+ConnectionEventHandler.ZIP_FILE_EXTENSION); archive.createNewFile(); - FileOutputStream fos = new FileOutputStream(archive); - ZipOutputStream zos = new ZipOutputStream(fos); - - zos.putNextEntry(new ZipEntry("metaData.json")); - PrintWriter pw = new PrintWriter(zos); - pw.write(json); - pw.flush(); - zos.closeEntry(); - - zos.putNextEntry(new ZipEntry("recording"+ConnectionEventHandler.TEMP_FILE_EXTENSION)); - FileInputStream fis = new FileInputStream(file); - int len; - while((len = fis.read(buffer)) > 0) { - zos.write(buffer, 0, len); - } - - fis.close(); - zos.closeEntry(); - - zos.close(); - - file.delete(); + ReplayFileIO.writeReplayFile(archive, file, metaData); + file.delete(); + GuiReplaySaving.replaySaving = false; } catch(Exception e) { e.printStackTrace(); diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java b/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java index 2a8a2497..4f79b32b 100644 --- a/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/PacketListener.java @@ -19,6 +19,7 @@ import net.minecraft.network.play.server.S0DPacketCollectItem; import net.minecraft.network.play.server.S0FPacketSpawnMob; import eu.crushedpixel.replaymod.chat.ChatMessageRequests; import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType; +import eu.crushedpixel.replaymod.editor.ReplayFileIO; import eu.crushedpixel.replaymod.holders.PacketData; import eu.crushedpixel.replaymod.reflection.MCPNames; @@ -32,8 +33,6 @@ public class PacketListener extends DataListener { private ChannelHandlerContext context = null; - private static final PacketSerializer packetSerializer = new PacketSerializer(EnumPacketDirection.CLIENTBOUND); - public void saveOnly(Packet packet) { try { if(packet instanceof S0CPacketSpawnPlayer) { @@ -69,7 +68,7 @@ public class PacketListener extends DataListener { if(packet instanceof S0DPacketCollectItem) { if(mc.thePlayer != null || - ((S0DPacketCollectItem) packet).func_149353_d() == mc.thePlayer.getEntityId()) { + ((S0DPacketCollectItem)packet).func_149353_d() == mc.thePlayer.getEntityId()) { super.channelRead(ctx, msg); return; } @@ -115,10 +114,6 @@ public class PacketListener extends DataListener { if(startTime == null) startTime = System.currentTimeMillis(); int timestamp = (int)(System.currentTimeMillis() - startTime); - - //Converts the packet back to a ByteBuffer for correct saving - - ByteBuf bb = Unpooled.buffer(); if(packet instanceof S0FPacketSpawnMob) { DataWatcher l = (DataWatcher)spawnMobDataWatcher.get(packet); @@ -135,14 +130,8 @@ public class PacketListener extends DataListener { spawnPlayerDataWatcher.set(packet, dw); } } - - packetSerializer.encode(ctx, packet, bb); - bb.readerIndex(0); - byte[] array = new byte[bb.readableBytes()]; - bb.readBytes(array); - - bb.readerIndex(0); + byte[] array = ReplayFileIO.serializePacket(packet); return new PacketData(array, timestamp); } diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/PacketSerializer.java b/src/main/java/eu/crushedpixel/replaymod/recording/PacketSerializer.java index 59d6b55f..6e290123 100644 --- a/src/main/java/eu/crushedpixel/replaymod/recording/PacketSerializer.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/PacketSerializer.java @@ -24,31 +24,24 @@ public class PacketSerializer extends MessageSerializer { } @Override - public void encode(ChannelHandlerContext p_encode_1_, Packet p_encode_2_, ByteBuf p_encode_3_) throws IOException { - //super.encode(p_encode_1_, p_encode_2_, p_encode_3_); - - Integer integer = ((EnumConnectionState)p_encode_1_.channel().attr(NetworkManager.attrKeyConnectionState).get()).getPacketId(EnumPacketDirection.CLIENTBOUND, p_encode_2_); + public void encode(ChannelHandlerContext ctx, Packet packet, ByteBuf byteBuf) throws IOException { + EnumConnectionState state = ((EnumConnectionState)ctx.channel().attr(NetworkManager.attrKeyConnectionState).get()); + encode(state, packet, byteBuf); + } + + public void encode(EnumConnectionState state, Packet packet, ByteBuf byteBuf) { + Integer integer = state.getPacketId(EnumPacketDirection.CLIENTBOUND, packet); - if (integer == null) - { + if (integer == null) { return; - } - else - { - PacketBuffer packetbuffer = new PacketBuffer(p_encode_3_); + } else { + PacketBuffer packetbuffer = new PacketBuffer(byteBuf); packetbuffer.writeVarIntToBuffer(integer.intValue()); - try - { - if (p_encode_2_ instanceof S0CPacketSpawnPlayer) - { - //p_encode_2_ = p_encode_2_; FML: Kill warning - } - - p_encode_2_.writePacketData(packetbuffer); + try { + packet.writePacketData(packetbuffer); } - catch (Throwable throwable) - { + catch (Throwable throwable) { throwable.printStackTrace(); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/ReplayMetaData.java b/src/main/java/eu/crushedpixel/replaymod/recording/ReplayMetaData.java index fdabfb8e..32fb1284 100644 --- a/src/main/java/eu/crushedpixel/replaymod/recording/ReplayMetaData.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/ReplayMetaData.java @@ -30,6 +30,9 @@ public class ReplayMetaData { public int getDuration() { return duration; } + public void setDuration(int duration) { + this.duration = duration; + } public long getDate() { return date; } diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/PacketInfo.java b/src/main/java/eu/crushedpixel/replaymod/replay/PacketInfo.java index edc7375a..53bf51b0 100644 --- a/src/main/java/eu/crushedpixel/replaymod/replay/PacketInfo.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/PacketInfo.java @@ -8,8 +8,6 @@ public class PacketInfo { private EnumConnectionState connectionState; private int packetID; - - public PacketInfo(byte[] bytes, EnumConnectionState connectionState, int packetID) { super(); diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java index c5dee480..48653295 100644 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java @@ -40,13 +40,13 @@ public class ReplayHandler { private static Keyframe selectedKeyframe; - private static boolean isReplaying = false; + private static boolean inPath = false; private static CameraEntity cameraEntity; private static List keyframes = new ArrayList(); - private static boolean replayActive = false; + private static boolean inReplay = false; public static long lastExit = 0; @@ -93,20 +93,20 @@ public class ReplayHandler { return gamma; } - public static void setReplaying(boolean replaying) { - isReplaying = replaying; + public static void setInPath(boolean replaying) { + inPath = replaying; } public static void startPath(boolean save) { - if(!ReplayHandler.isReplaying()) ReplayProcess.startReplayProcess(save); + if(!ReplayHandler.isInPath()) ReplayProcess.startReplayProcess(save); } public static void interruptReplay() { ReplayProcess.stopReplayProcess(false); } - public static boolean isReplaying() { - return isReplaying; + public static boolean isInPath() { + return inPath; } public static void setCameraEntity(CameraEntity entity) { @@ -309,8 +309,8 @@ public class ReplayHandler { sortKeyframes(); } - public static boolean replayActive() { - return replayActive; + public static boolean isInReplay() { + return inReplay; } public static boolean isPaused() { @@ -364,7 +364,7 @@ public class ReplayHandler { //Load lighting and trigger update ReplayMod.replaySettings.setLightingEnabled(ReplayMod.replaySettings.isLightingEnabled()); - replayActive = true; + inReplay = true; } public static void restartReplay() { @@ -390,7 +390,7 @@ public class ReplayHandler { ReplayMod.overlay.resetUI(); } catch(Exception e) {} - replayActive = true; + inReplay = true; } public static void endReplay() { @@ -406,7 +406,7 @@ public class ReplayHandler { } */ - replayActive = false; + inReplay = false; } public static Keyframe getSelected() { diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java index 1e45fafa..f731b73a 100644 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayProcess.java @@ -63,7 +63,7 @@ public class ReplayProcess { lastTimestamp = -1; linear = ReplayMod.replaySettings.isLinearMovement(); ReplayHandler.sortKeyframes(); - ReplayHandler.setReplaying(true); + ReplayHandler.setInPath(true); previousReplaySpeed = ReplayHandler.getSpeed(); TimeKeyframe tf = ReplayHandler.getNextTimeKeyframe(-1); @@ -85,7 +85,7 @@ public class ReplayProcess { @Override public void run() { - while(ReplayHandler.isReplaying()) { + while(ReplayHandler.isInPath()) { if(!blocked) { mc.addScheduledTask(new Runnable() { @Override @@ -109,10 +109,10 @@ public class ReplayProcess { } public static void stopReplayProcess(boolean finished) { - if(!ReplayHandler.isReplaying()) return; + if(!ReplayHandler.isInPath()) return; if(finished) ChatMessageRequests.addChatMessage("Replay finished!", ChatMessageType.INFORMATION); else ChatMessageRequests.addChatMessage("Replay stopped!", ChatMessageType.INFORMATION); - ReplayHandler.setReplaying(false); + ReplayHandler.setInPath(false); MCTimerHandler.setActiveTimer(); ReplayHandler.setSpeed(previousReplaySpeed); ReplayHandler.setSpeed(0); @@ -434,7 +434,7 @@ public class ReplayProcess { //Video capturing, for testing purposes if(isVideoRecording()) { try { - if(!VideoWriter.isRecording() && ReplayHandler.isReplaying()) { + if(!VideoWriter.isRecording() && ReplayHandler.isInPath()) { VideoWriter.startRecording(mc.displayWidth, mc.displayHeight); } else { VideoWriter.writeImage(ScreenCapture.captureScreen()); diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java index 5727c7d1..1a1637e1 100644 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplaySender.java @@ -15,7 +15,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.UUID; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiDownloadTerrain; @@ -48,7 +47,6 @@ import net.minecraft.network.play.server.S30PacketWindowItems; import net.minecraft.network.play.server.S36PacketSignEditorOpen; import net.minecraft.network.play.server.S37PacketStatistics; import net.minecraft.network.play.server.S38PacketPlayerListItem; -import net.minecraft.network.play.server.S38PacketPlayerListItem.AddPlayerData; import net.minecraft.network.play.server.S39PacketPlayerAbilities; import net.minecraft.network.play.server.S43PacketCamera; import net.minecraft.network.play.server.S45PacketTitle; @@ -63,11 +61,12 @@ import org.apache.commons.compress.archivers.zip.ZipFile; import org.apache.commons.io.FilenameUtils; import com.google.gson.Gson; -import com.mojang.authlib.GameProfile; import eu.crushedpixel.replaymod.ReplayMod; +import eu.crushedpixel.replaymod.editor.ReplayFileIO; import eu.crushedpixel.replaymod.entities.CameraEntity; import eu.crushedpixel.replaymod.events.RecordingHandler; +import eu.crushedpixel.replaymod.holders.PacketData; import eu.crushedpixel.replaymod.holders.Position; import eu.crushedpixel.replaymod.recording.ConnectionEventHandler; import eu.crushedpixel.replaymod.recording.ReplayMetaData; @@ -86,7 +85,6 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { private long toleratedTimeStamp = Long.MAX_VALUE; private File replayFile; - private PacketDeserializer ds = new PacketDeserializer(EnumPacketDirection.SERVERBOUND); private boolean active = true; private ZipFile archive; private DataInputStream dis; @@ -148,7 +146,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { setReplaySpeed(replaySpeed); if((millis < currentTimeStamp && !isHurrying())) { - if(ReplayHandler.isReplaying()) { + if(ReplayHandler.isInPath()) { if(millis < toleratedTimeStamp) { return; } @@ -255,9 +253,9 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { lastPacketSent = System.currentTimeMillis(); ReplayHandler.restartReplay(); } + while(!terminate && !startFromBeginning && (!paused() || FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class))) { try { - /* * LOGIC: * While behind desired timestamp, only send packets @@ -270,15 +268,16 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { */ - if(!hurryToTimestamp && ReplayHandler.isReplaying()) { + if(!hurryToTimestamp && ReplayHandler.isInPath()) { continue; } - int timestamp = dis.readInt(); + PacketData pd = ReplayFileIO.readPacketData(dis); - currentTimeStamp = timestamp; + currentTimeStamp = pd.getTimestamp(); + //System.out.println(currentTimeStamp); - if(!ReplayHandler.isReplaying() && !hurryToTimestamp && !FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class)) { + if(!ReplayHandler.isInPath() && !hurryToTimestamp && !FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class)) { //if(!hurryToTimestamp && !FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class)) { int timeWait = (int)Math.round((currentTimeStamp - lastTimeStamp)/replaySpeed); long timeDiff = System.currentTimeMillis() - lastPacketSent; @@ -287,15 +286,11 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { Thread.sleep(timeToSleep); } - int bytes = dis.readInt(); - byte[] bb = new byte[bytes]; - dis.readFully(bb); - - ReplaySender.this.channelRead(ctx, bb); + ReplaySender.this.channelRead(ctx, pd.getByteArray()); lastTimeStamp = currentTimeStamp; - if(ReplayHandler.isReplaying()) { + if(ReplayHandler.isInPath()) { toleratedTimeStamp = lastTimeStamp; } else { toleratedTimeStamp = -1; @@ -303,12 +298,12 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { if(hurryToTimestamp && currentTimeStamp >= desiredTimeStamp && !startFromBeginning) { hurryToTimestamp = false; - if(!ReplayHandler.isReplaying() || hasRestarted) { + if(!ReplayHandler.isInPath() || hasRestarted) { MCTimerHandler.advanceRenderPartialTicks(5); MCTimerHandler.advancePartialTicks(5); MCTimerHandler.advanceTicks(5); } - if(!ReplayHandler.isReplaying()) { + if(!ReplayHandler.isInPath()) { Position pos = ReplayHandler.getLastPosition(); CameraEntity cam = ReplayHandler.getCameraEntity(); if(cam != null) { @@ -320,17 +315,18 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } } } - if(!ReplayHandler.isReplaying()) { + if(!ReplayHandler.isInPath()) { setReplaySpeed(0); } hasRestarted = false; } } catch(EOFException eof) { + System.out.println("End of File encountered!"); dis = new DataInputStream(archive.getInputStream(replayEntry)); setReplaySpeed(0); } catch(IOException e) { - //e.printStackTrace(); + e.printStackTrace(); } } } @@ -398,12 +394,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { byte[] ba = (byte[])msg; try { - ByteBuf bb = Unpooled.wrappedBuffer(ba); - PacketBuffer pb = new PacketBuffer(bb); - - int i = pb.readVarIntFromBuffer(); - - Packet p = EnumConnectionState.PLAY.getPacket(EnumPacketDirection.CLIENTBOUND, i); + Packet p = ReplayFileIO.deserializePacket(ba); if(hurryToTimestamp) { //If hurrying, ignore some packets if(p instanceof S45PacketTitle || @@ -425,8 +416,6 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { if(badPackets.contains(p.getClass())) return; try { - p.readPacketData(pb); - if(p instanceof S1CPacketEntityMetadata) { if((Integer)metadataPacketEntityId.get(p) == actualID) { metadataPacketEntityId.set(p, RecordingHandler.entityID); @@ -434,6 +423,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } if(p instanceof S01PacketJoinGame) { + //System.out.println("FOUND JOIN PACKET"); allowMovement = true; int entId = (Integer)joinPacketEntityId.get(p); actualID = entId; @@ -493,7 +483,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { if(p instanceof S08PacketPlayerPosLook) { final S08PacketPlayerPosLook ppl = (S08PacketPlayerPosLook)p; - if(ReplayHandler.isReplaying() && !hurryToTimestamp) return; + if(ReplayHandler.isInPath() && !hurryToTimestamp) return; CameraEntity cent = ReplayHandler.getCameraEntity(); @@ -531,6 +521,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { if(p instanceof S43PacketCamera) { return; } + super.channelRead(ctx, p); } catch(Exception e) { System.out.println(p.getClass()); @@ -538,7 +529,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } } catch(Exception e) { - //e.printStackTrace(); + e.printStackTrace(); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/spectate/SpectateHandler.java b/src/main/java/eu/crushedpixel/replaymod/replay/spectate/SpectateHandler.java index 2861bbf6..ca29254a 100644 --- a/src/main/java/eu/crushedpixel/replaymod/replay/spectate/SpectateHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/spectate/SpectateHandler.java @@ -24,7 +24,7 @@ public class SpectateHandler { }; public static void openSpectateSelection() { - if(!ReplayHandler.replayActive()) { + if(!ReplayHandler.isInReplay()) { return; }