Cleaned up even more GUIs

Added possibility to create Thumbnails and show them in the Replay Manager
This commit is contained in:
Marius Metzger
2015-01-25 20:36:02 +01:00
parent f39e0f9eae
commit 8c2cf9011e
23 changed files with 663 additions and 206 deletions

View File

@@ -1,66 +0,0 @@
package eu.crushedpixel.replaymod.gui;
import java.io.IOException;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiIngameMenu;
import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.resources.I18n;
import net.minecraft.client.settings.GameSettings.Options;
public class GuiExitReplay extends GuiIngameMenu {
@Override
public void initGui()
{
this.buttonList.clear();
byte b0 = -16;
boolean flag = true;
this.buttonList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 120 + b0, I18n.format("menu.returnToMenu", new Object[0])));
if (!this.mc.isIntegratedServerRunning())
{
((GuiButton)this.buttonList.get(0)).displayString = I18n.format("Exit Replay", new Object[0]);
}
this.buttonList.add(new GuiButton(4, this.width / 2 - 100, this.height / 4 + 24 + b0, I18n.format("menu.returnToGame", new Object[0])));
this.buttonList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + b0, 98, 20, I18n.format("menu.options", new Object[0])));
this.buttonList.add(new GuiButton(12, this.width / 2 + 2, this.height / 4 + 96 + b0, 98, 20, I18n.format("fml.menu.modoptions")));
GuiButton guibutton;
this.buttonList.add(guibutton = new GuiButton(7, this.width / 2 - 100, this.height / 4 + 72 + b0, 200, 20, I18n.format("menu.shareToLan", new Object[0])));
this.buttonList.add(new GuiButton(5, this.width / 2 - 100, this.height / 4 + 48 + b0, 98, 20, I18n.format("gui.achievements", new Object[0])));
this.buttonList.add(new GuiButton(6, this.width / 2 + 2, this.height / 4 + 48 + b0, 98, 20, I18n.format("gui.stats", new Object[0])));
guibutton.enabled = this.mc.isSingleplayer() && !this.mc.getIntegratedServer().getPublic();
}
@Override
protected void actionPerformed(GuiButton button) throws IOException
{
if(button.id == 1) {
button.enabled = false;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
mc.displayGuiScreen(new GuiReplaySaving());
ReplayHandler.endReplay();
ReplayHandler.setSpeed(1f);
mc.gameSettings.setOptionFloatValue(Options.GAMMA, ReplayHandler.getInitialGamma());
ReplayHandler.lastExit = System.currentTimeMillis();
mc.theWorld.sendQuittingDisconnectingPacket();
}
});
t.run();
} else {
super.actionPerformed(button);
}
}
}

View File

@@ -2,6 +2,7 @@ package eu.crushedpixel.replaymod.gui;
import java.awt.Color;
import eu.crushedpixel.replaymod.gui.replaymanager.GuiReplayManager;
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiIngameMenu;
@@ -10,14 +11,22 @@ import net.minecraftforge.fml.client.FMLClientHandler;
public class GuiReplaySaving extends GuiScreen {
public static boolean replaySaving = false;
private GuiScreen waiting = null;
public GuiReplaySaving(GuiScreen waiting) {
this.waiting = waiting;
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
this.drawDefaultBackground();
this.drawCenteredString(this.fontRendererObj, "Saving Replay File...", this.width / 2, 20, 16777215);
this.drawCenteredString(this.fontRendererObj, "Please wait while your recent Replay is being saved.", this.width / 2, 40, 16777215);
super.drawScreen(mouseX, mouseY, partialTicks);
if(!ConnectionEventHandler.saving) {
Minecraft.getMinecraft().displayGuiScreen(new GuiReplayManager());
if(!replaySaving) {
Minecraft.getMinecraft().displayGuiScreen(waiting);
}
}

View File

@@ -1,4 +1,4 @@
package eu.crushedpixel.replaymod.gui;
package eu.crushedpixel.replaymod.gui.replaymanager;
import java.io.File;
import java.io.IOException;

View File

@@ -1,11 +1,15 @@
package eu.crushedpixel.replaymod.gui;
package eu.crushedpixel.replaymod.gui.replaymanager;
import java.awt.image.BufferedImage;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
@@ -13,6 +17,8 @@ import net.minecraft.client.gui.GuiListExtended.IGuiListEntry;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.texture.DynamicTexture;
import net.minecraft.util.ResourceLocation;
import eu.crushedpixel.replaymod.recording.ReplayMetaData;
public class GuiReplayListEntry implements IGuiListEntry {
@@ -22,8 +28,11 @@ public class GuiReplayListEntry implements IGuiListEntry {
private ReplayMetaData metaData;
private String fileName;
private final ResourceLocation textureResource;
private DynamicTexture dynTex = null;
private BufferedImage image = null;
public ReplayMetaData getMetaData() {
return metaData;
@@ -41,20 +50,34 @@ public class GuiReplayListEntry implements IGuiListEntry {
this.fileName = fileName;
}
private boolean selected = false;
private GuiReplayListExtended parent;
public GuiReplayListEntry(GuiReplayListExtended parent, String fileName, ReplayMetaData metaData) {
public GuiReplayListEntry(GuiReplayListExtended parent, String fileName, ReplayMetaData metaData, BufferedImage image) {
this.metaData = metaData;
this.fileName = fileName;
this.parent = parent;
this.textureResource = new ResourceLocation("thumbs/"+fileName);
dynTex = null;
this.image = image;
}
@Override
public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected)
{
public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected) {
minecraft.fontRendererObj.drawString(fileName, x + 3, y + 1, 16777215);
//Draw thumbnail
if(image != null) {
if(dynTex == null) {
dynTex = new DynamicTexture(image);
minecraft.getTextureManager().loadTexture(textureResource, dynTex);
dynTex.updateDynamicTexture();
ResourceHelper.registerResource(textureResource);
}
minecraft.getTextureManager().bindTexture(textureResource); //Will be freed by the ResourceHelper
Gui.drawScaledCustomSizeModalRect(x-60, y, 0, 0, 1280, 720, 57, 32, 1280, 720);
}
List<String> list = new ArrayList<String>();
list.add(metaData.getServerName()+" ("+dateFormat.format(new Date(metaData.getDate()))+")");
@@ -67,6 +90,8 @@ public class GuiReplayListEntry implements IGuiListEntry {
for (int l1 = 0; l1 < Math.min(list.size(), 2); ++l1) {
minecraft.fontRendererObj.drawString((String)list.get(l1), x + 3, y + 12 + minecraft.fontRendererObj.FONT_HEIGHT * l1, 8421504);
}
}
@Override

View File

@@ -1,5 +1,6 @@
package eu.crushedpixel.replaymod.gui;
package eu.crushedpixel.replaymod.gui.replaymanager;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
@@ -48,6 +49,7 @@ public class GuiReplayListExtended extends GuiListExtended {
for (int j1 = 0; j1 < i1; ++j1)
{
int k1 = p_148120_2_ + j1 * this.slotHeight + this.headerPadding;
int l1 = this.slotHeight - 4;
@@ -76,7 +78,7 @@ public class GuiReplayListExtended extends GuiListExtended {
tessellator.draw();
GlStateManager.enableTexture2D();
}
this.drawSlot(j1, p_148120_1_, k1, l1, p_148120_3_, p_148120_4_);
}
}
@@ -88,8 +90,8 @@ public class GuiReplayListExtended extends GuiListExtended {
entries = new ArrayList<GuiReplayListEntry>();
}
public void addEntry(String fileName, ReplayMetaData metaData) {
entries.add(new GuiReplayListEntry(this, fileName, metaData));
public void addEntry(String fileName, ReplayMetaData metaData, BufferedImage image) {
entries.add(new GuiReplayListEntry(this, fileName, metaData, image));
}
@Override

View File

@@ -1,5 +1,11 @@
package eu.crushedpixel.replaymod.gui;
package eu.crushedpixel.replaymod.gui.replaymanager;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
import io.netty.buffer.Unpooled;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
@@ -12,10 +18,13 @@ import java.util.Comparator;
import java.util.Date;
import java.util.List;
import javax.imageio.ImageIO;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiYesNo;
import net.minecraft.client.gui.GuiYesNoCallback;
import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.client.resources.I18n;
import net.minecraft.util.Util;
@@ -28,9 +37,11 @@ import org.lwjgl.input.Keyboard;
import com.google.gson.Gson;
import com.mojang.realmsclient.util.Pair;
import eu.crushedpixel.replaymod.gui.GuiReplaySettings;
import eu.crushedpixel.replaymod.recording.ConnectionEventHandler;
import eu.crushedpixel.replaymod.recording.ReplayMetaData;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.ImageUtils;
public class GuiReplayManager extends GuiScreen implements GuiYesNoCallback {
@@ -41,12 +52,12 @@ public class GuiReplayManager extends GuiScreen implements GuiYesNoCallback {
private String hoveringText;
private boolean initialized;
private GuiReplayListExtended replayGuiList;
private List<Pair<File, ReplayMetaData>> replayFileList = new ArrayList<Pair<File, ReplayMetaData>>();
private List<Pair<Pair<File, ReplayMetaData>, BufferedImage>> replayFileList = new ArrayList<Pair<Pair<File, ReplayMetaData>, BufferedImage>>();
private GuiButton loadButton, folderButton, renameButton, deleteButton, cancelButton, settingsButton;
private static Gson gson = new Gson();
private boolean replaying = false;
private static final int LOAD_BUTTON_ID = 9001;
private static final int FOLDER_BUTTON_ID = 9002;
private static final int RENAME_BUTTON_ID = 9003;
@@ -55,14 +66,14 @@ public class GuiReplayManager extends GuiScreen implements GuiYesNoCallback {
private static final int CANCEL_BUTTON_ID = 9006;
private boolean delete_file = false;
private void reloadFiles() {
replayGuiList.clearEntries();
replayFileList = new ArrayList<Pair<File, ReplayMetaData>>();
replayFileList = new ArrayList<Pair<Pair<File, ReplayMetaData>, BufferedImage>>();
File folder = new File("./replay_recordings/");
folder.mkdirs();
for(File file : folder.listFiles()) {
if(("."+FilenameUtils.getExtension(file.getAbsolutePath())).equals(ConnectionEventHandler.ZIP_FILE_EXTENSION)) {
try {
@@ -70,14 +81,33 @@ public class GuiReplayManager extends GuiScreen implements GuiYesNoCallback {
ZipArchiveEntry recfile = archive.getEntry("recording"+ConnectionEventHandler.TEMP_FILE_EXTENSION);
ZipArchiveEntry metadata = archive.getEntry("metaData"+ConnectionEventHandler.JSON_FILE_EXTENSION);
ZipArchiveEntry image = archive.getEntry("thumb");
BufferedImage img = null;
if(image != null) {
InputStream is = archive.getInputStream(image);
is.skip(7);
BufferedImage bimg = ImageIO.read(is);
if(bimg != null) {
img = ImageUtils.scaleImage(bimg, new Dimension(1280, 720));
}
/* Old way of reading thumbnail
else {
is = archive.getInputStream(image);
bimg = ImageIO.read(is);
img = ImageUtils.scaleImage(bimg, new Dimension(1280, 720));
}
*/
}
InputStream is = archive.getInputStream(metadata);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String json = br.readLine();
ReplayMetaData metaData = gson.fromJson(json, ReplayMetaData.class);
replayFileList.add(Pair.of(file, metaData));
replayFileList.add(Pair.of(Pair.of(file, metaData), img));
archive.close();
} catch(Exception e) {
@@ -85,21 +115,25 @@ public class GuiReplayManager extends GuiScreen implements GuiYesNoCallback {
}
}
}
Collections.sort(replayFileList, new FileAgeComparator());
for(Pair<File, ReplayMetaData> p : replayFileList) {
replayGuiList.addEntry(FilenameUtils.getBaseName(p.first().getName()), p.second());
for(Pair<Pair<File, ReplayMetaData>, BufferedImage> p : replayFileList) {
replayGuiList.addEntry(FilenameUtils.getBaseName(p.first().first().getName()), p.first().second(), p.second());
}
}
public class FileAgeComparator implements Comparator<Pair<File, ReplayMetaData>> {
public class FileAgeComparator implements Comparator<Pair<Pair<File, ReplayMetaData>, BufferedImage>> {
@Override
public int compare(Pair<File, ReplayMetaData> o1, Pair<File, ReplayMetaData> o2) {
return (int)(new Date(o2.second().getDate()).compareTo(new Date(o1.second().getDate())));
public int compare(Pair<Pair<File, ReplayMetaData>, BufferedImage> o1, Pair<Pair<File, ReplayMetaData>, BufferedImage> o2) {
try {
return (int)(new Date(o2.first().second().getDate()).compareTo(new Date(o1.first().second().getDate())));
} catch(Exception e) {
return 0;
}
}
}
public void initGui()
@@ -183,7 +217,7 @@ public class GuiReplayManager extends GuiScreen implements GuiYesNoCallback {
}
else if(button.id == RENAME_BUTTON_ID)
{
File file = replayFileList.get(replayGuiList.selected).first();
File file = replayFileList.get(replayGuiList.selected).first().first();
this.mc.displayGuiScreen(new GuiRenameReplay(this, file));
}
else if(button.id == FOLDER_BUTTON_ID)
@@ -241,7 +275,7 @@ public class GuiReplayManager extends GuiScreen implements GuiYesNoCallback {
if (result)
{
replayFileList.get(replayGuiList.selected).first().delete();
replayFileList.get(replayGuiList.selected).first().first().delete();
replayFileList.remove(replayGuiList.selected);
}
@@ -265,16 +299,15 @@ public class GuiReplayManager extends GuiScreen implements GuiYesNoCallback {
deleteButton.enabled = b;
}
public void loadReplay(int id)
{
mc.displayGuiScreen((GuiScreen)null);
public void loadReplay(int id) {
mc.displayGuiScreen((GuiScreen)null);
try {
ReplayHandler.startReplay(replayFileList.get(id).first());
try {
ReplayHandler.startReplay(replayFileList.get(id).first().first());
} catch(Exception e) {
e.printStackTrace();
}
}
}
}

View File

@@ -0,0 +1,24 @@
package eu.crushedpixel.replaymod.gui.replaymanager;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
public class ResourceHelper {
private static List<ResourceLocation> openResources = new ArrayList<ResourceLocation>();
public static void registerResource(ResourceLocation loc) {
openResources.add(loc);
}
public static void freeResources() {
for(ResourceLocation loc : openResources) {
Minecraft.getMinecraft().getTextureManager().deleteTexture(loc);
}
openResources = new ArrayList<ResourceLocation>();
}
}