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

This commit is contained in:
CrushedPixel
2015-06-01 12:14:22 +02:00
parent 7aaae3ea5c
commit 87223fcc0e
4 changed files with 72 additions and 16 deletions

View File

@@ -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()) {

View File

@@ -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
}
}

View File

@@ -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<PacketData> queue = new ConcurrentLinkedQueue<PacketData>();
private DataOutputStream stream;
Thread outputThread = new Thread(new Runnable() {
@Override
public void run() {
HashMap<Class, Integer> counts = new HashMap<Class, Integer>();
while(active) {
PacketData dataReciever = queue.poll();
if(dataReciever != null) {
@@ -128,10 +124,6 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter {
e.printStackTrace();
}
for(Entry<Class, Integer> 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();
}
}

View File

@@ -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<Pair<Pair<File, String>, File>> filesToMove = new ConcurrentLinkedQueue<Pair<Pair<File, String>, File>>();
private boolean shutdown = false;
private List<GuiReplaySaving> listeners = new ArrayList<GuiReplaySaving>();
//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<GuiReplaySaving>();
}
}
}