From 87223fcc0edd346a595262d1e5c95c7de32f366b Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Mon, 1 Jun 2015 12:14:22 +0200 Subject: [PATCH] Whenever a Replay File is being written or modified and the user is not in-game, a GuiReplaySaving is opened and asks him to wait --- .../replaymod/events/GuiEventHandler.java | 8 ++- .../replaymod/gui/GuiReplaySaving.java | 9 ++++ .../replaymod/recording/DataListener.java | 17 +++--- .../registry/ReplayFileAppender.java | 54 +++++++++++++++++++ 4 files changed, 72 insertions(+), 16 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java index da44083f..6cbc85da 100755 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiEventHandler.java @@ -68,14 +68,12 @@ public class GuiEventHandler { if(ReplayHandler.isInReplay()) ReplayHandler.setInReplay(false); } - if(!AuthenticationHandler.isAuthenticated()) return; - - /* - if(event.gui != null && GuiReplaySaving.replaySaving && !allowedGUIs.contains(event.gui.getClass())) { + if(event.gui != null && ReplayMod.replayFileAppender.isBusy() && !allowedGUIs.contains(event.gui.getClass())) { event.gui = new GuiReplaySaving(event.gui); return; } - */ + + if(!AuthenticationHandler.isAuthenticated()) return; if(event.gui instanceof GuiChat || event.gui instanceof GuiInventory) { if(ReplayHandler.isInReplay()) { diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiReplaySaving.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiReplaySaving.java index 41bb9d48..46760ab4 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiReplaySaving.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiReplaySaving.java @@ -1,12 +1,17 @@ package eu.crushedpixel.replaymod.gui; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.resources.I18n; +import java.io.IOException; + public class GuiReplaySaving extends GuiScreen { private GuiScreen waiting = null; + private final Minecraft mc = Minecraft.getMinecraft(); + public GuiReplaySaving(GuiScreen waiting) { this.waiting = waiting; } @@ -23,4 +28,8 @@ public class GuiReplaySaving extends GuiScreen { mc.displayGuiScreen(waiting); } + @Override + protected void keyTyped(char typedChar, int keyCode) throws IOException { + //Ignore key inputs to disallow users from closing this GUI + } } diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java b/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java index 7e7afcda..137668cb 100755 --- a/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java @@ -3,6 +3,7 @@ package eu.crushedpixel.replaymod.recording; import com.google.common.hash.Hashing; import com.google.common.io.Files; import com.google.gson.Gson; +import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.holders.PacketData; import eu.crushedpixel.replaymod.utils.ReplayFile; import eu.crushedpixel.replaymod.utils.ReplayFileIO; @@ -17,7 +18,6 @@ import java.io.*; import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -48,8 +48,6 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { this.worldName = worldName; this.singleplayer = singleplayer; - System.out.println(worldName); - FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream out = new DataOutputStream(bos); @@ -58,7 +56,6 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { public void setWorldName(String worldName) { this.worldName = worldName; - System.out.println(worldName); } @Override @@ -88,13 +85,12 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { private ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); private DataOutputStream stream; + Thread outputThread = new Thread(new Runnable() { @Override public void run() { - HashMap counts = new HashMap(); - while(active) { PacketData dataReciever = queue.poll(); if(dataReciever != null) { @@ -128,10 +124,6 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { e.printStackTrace(); } - for(Entry entries : counts.entrySet()) { - System.out.println(entries.getKey() + "| " + entries.getValue()); - } - } }, "replaymod-packet-writer"); @@ -148,6 +140,8 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { active = false; try { + ReplayMod.replayFileAppender.startNewReplayFileWriting(); + String mcversion = Minecraft.getMinecraft().getVersion(); String[] split = mcversion.split("-"); if(split.length > 0) { @@ -157,7 +151,6 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { String[] pl = players.toArray(new String[players.size()]); ReplayMetaData metaData = new ReplayMetaData(singleplayer, worldName, (int) lastSentPacket, startTime, pl, mcversion); - String json = gson.toJson(metaData); File folder = ReplayFileIO.getReplayFolder(); @@ -171,6 +164,8 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { } catch(Exception e) { e.printStackTrace(); + } finally { + ReplayMod.replayFileAppender.replayFileWritingFinished(); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/registry/ReplayFileAppender.java b/src/main/java/eu/crushedpixel/replaymod/registry/ReplayFileAppender.java index ad52bafe..4d20a385 100644 --- a/src/main/java/eu/crushedpixel/replaymod/registry/ReplayFileAppender.java +++ b/src/main/java/eu/crushedpixel/replaymod/registry/ReplayFileAppender.java @@ -1,10 +1,14 @@ package eu.crushedpixel.replaymod.registry; +import eu.crushedpixel.replaymod.gui.GuiReplaySaving; import eu.crushedpixel.replaymod.utils.ReplayFileIO; +import net.minecraft.client.Minecraft; +import net.minecraftforge.fml.client.FMLClientHandler; import org.apache.commons.lang3.tuple.Pair; import java.io.File; import java.util.ArrayList; +import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -12,6 +16,31 @@ public class ReplayFileAppender extends Thread { private Queue, File>> filesToMove = new ConcurrentLinkedQueue, File>>(); private boolean shutdown = false; + private List listeners = new ArrayList(); + + //this is true if the DataListener is currently busy saving a newly recorded Replay File + private boolean newReplayFileWriting = false; + + public void startNewReplayFileWriting() { + newReplayFileWriting = true; + + if(!FMLClientHandler.instance().isGUIOpen(GuiReplaySaving.class)) { + Minecraft.getMinecraft().addScheduledTask(new Runnable() { + @Override + public void run() { + final GuiReplaySaving savingScreen = new GuiReplaySaving(null); + addFinishListener(savingScreen); + + Minecraft.getMinecraft().displayGuiScreen(savingScreen); + } + }); + } + } + + public void replayFileWritingFinished() { + newReplayFileWriting = false; + callListeners(); + } public ReplayFileAppender() { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @@ -36,6 +65,14 @@ public class ReplayFileAppender extends Thread { shutdown = true; } + public boolean isBusy() { + return !filesToMove.isEmpty() && !newReplayFileWriting; + } + + public void addFinishListener(GuiReplaySaving gui) { + listeners.add(gui); + } + @Override public void run() { while(!shutdown || !filesToMove.isEmpty()) { @@ -47,6 +84,8 @@ public class ReplayFileAppender extends Thread { } catch(Exception e) { e.printStackTrace(); filesToMove.add(mv); + } finally { + callListeners(); } } else { filesToMove.add(mv); @@ -58,4 +97,19 @@ public class ReplayFileAppender extends Thread { } } + private void callListeners() { + if(filesToMove.isEmpty() && !newReplayFileWriting) { + for(final GuiReplaySaving gui : listeners) { + Minecraft.getMinecraft().addScheduledTask(new Runnable() { + @Override + public void run() { + gui.dispatch(); + } + }); + } + + listeners = new ArrayList(); + } + } + }