From 89cc6938f885fb5e134e83838d41bcd29afbe0c2 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Tue, 7 Jul 2015 20:14:40 +0200 Subject: [PATCH] Reworked AssetRepository to link every Asset to a UUID UUIDs are now being stored in the Replay File and loaded --- .../replaymod/assets/AssetRepository.java | 72 ++++++++++++++----- .../events/handlers/KeyInputHandler.java | 3 +- .../replaymod/gui/GuiAssetManager.java | 24 ++++++- .../replaymod/replay/ReplayHandler.java | 10 +++ .../replaymod/utils/ReplayFile.java | 13 +++- 5 files changed, 97 insertions(+), 25 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/assets/AssetRepository.java b/src/main/java/eu/crushedpixel/replaymod/assets/AssetRepository.java index 9d4763d3..4fb42d61 100644 --- a/src/main/java/eu/crushedpixel/replaymod/assets/AssetRepository.java +++ b/src/main/java/eu/crushedpixel/replaymod/assets/AssetRepository.java @@ -3,6 +3,7 @@ package eu.crushedpixel.replaymod.assets; import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.utils.ReplayFile; +import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.ArrayUtils; @@ -10,46 +11,79 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class AssetRepository { - private List replayAssets; + private Map replayAssets; public AssetRepository() { - replayAssets = new ArrayList(); + replayAssets = new HashMap(); } public ReplayAsset addAsset(String assetFileName, InputStream inputStream) throws IOException { + return addAsset(assetFileName, inputStream, null); + } + + public ReplayAsset addAsset(String assetFileName, InputStream inputStream, UUID uuid) throws IOException { + + if(uuid == null) { + uuid = UUID.randomUUID(); + } else { + assetFileName = assetFileName.replace(uuid.toString()+"_", ""); + } + ReplayAsset asset = assetFromFileName(assetFileName); asset.loadFromStream(inputStream); - replayAssets.add(asset); + replayAssets.put(uuid, asset); return asset; } public void removeAsset(ReplayAsset asset) { - replayAssets.remove(asset); + for(Map.Entry e : + new HashSet>(replayAssets.entrySet())) + if(e.getValue().equals(asset)) + replayAssets.remove(e.getKey()); } public void saveAssets() { - for(ReplayAsset asset : replayAssets) { - try { - String filepath = ReplayFile.ENTRY_ASSET_FOLDER + asset.getDisplayString() + "." + asset.getSavedFileExtension(); + try { + ReplayFile replayFile = new ReplayFile(ReplayHandler.getReplayFile()); - File toAdd = File.createTempFile(asset.getDisplayString(), asset.getSavedFileExtension()); - FileOutputStream fos = new FileOutputStream(toAdd); - asset.writeToStream(fos); - - ReplayMod.replayFileAppender.registerModifiedFile(toAdd, filepath, ReplayHandler.getReplayFile()); - } catch(IOException e) { - e.printStackTrace(); + Enumeration entries = replayFile.getEntries(); + while(entries.hasMoreElements()) { + ZipArchiveEntry entry = entries.nextElement(); + if(entry.getName().startsWith(ReplayFile.ENTRY_ASSET_FOLDER)) { + ReplayMod.replayFileAppender.registerModifiedFile(null, entry.getName(), ReplayHandler.getReplayFile()); + } } - } + replayFile.close(); + + ReplayMod.replayFileAppender.deleteAllFilesByFolder(ReplayFile.ENTRY_ASSET_FOLDER, ReplayHandler.getReplayFile()); + + for(Map.Entry e : replayAssets.entrySet()) { + UUID uuid = e.getKey(); + ReplayAsset asset = e.getValue(); + try { + String filepath = ReplayFile.ENTRY_ASSET_FOLDER + uuid.toString()+ "_" + asset.getDisplayString() + "." + asset.getSavedFileExtension(); + + File toAdd = File.createTempFile(asset.getDisplayString(), asset.getSavedFileExtension()); + FileOutputStream fos = new FileOutputStream(toAdd); + asset.writeToStream(fos); + + + ReplayMod.replayFileAppender.registerModifiedFile(toAdd, filepath, ReplayHandler.getReplayFile()); + } catch(IOException io) { + io.printStackTrace(); + } + } + } catch(IOException e) { + e.printStackTrace(); + } } public static ReplayAsset assetFromFileName(String filename) { @@ -63,6 +97,8 @@ public class AssetRepository { throw new UnsupportedOperationException("Can't create ReplayAsset from File "+filename); } - + public List getCopyOfReplayAssets() { + return new ArrayList(replayAssets.values()); + } } diff --git a/src/main/java/eu/crushedpixel/replaymod/events/handlers/KeyInputHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/handlers/KeyInputHandler.java index be3afd57..da7cf3a6 100755 --- a/src/main/java/eu/crushedpixel/replaymod/events/handlers/KeyInputHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/handlers/KeyInputHandler.java @@ -1,7 +1,6 @@ package eu.crushedpixel.replaymod.events.handlers; import eu.crushedpixel.replaymod.ReplayMod; -import eu.crushedpixel.replaymod.assets.AssetRepository; import eu.crushedpixel.replaymod.entities.CameraEntity.MoveDirection; import eu.crushedpixel.replaymod.gui.GuiAssetManager; import eu.crushedpixel.replaymod.gui.GuiKeyframeRepository; @@ -204,7 +203,7 @@ public class KeyInputHandler { } if(kb.getKeyDescription().equals(KeybindRegistry.KEY_ASSET_MANAGER) && (kb.isPressed() || kb.getKeyCode() == keyCode)) { - mc.displayGuiScreen(new GuiAssetManager(new AssetRepository())); + mc.displayGuiScreen(new GuiAssetManager()); } } } diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiAssetManager.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiAssetManager.java index 6307463a..460a8bcc 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiAssetManager.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiAssetManager.java @@ -6,6 +6,7 @@ import eu.crushedpixel.replaymod.assets.ReplayAsset; import eu.crushedpixel.replaymod.gui.elements.*; import eu.crushedpixel.replaymod.gui.elements.listeners.FileChooseListener; import eu.crushedpixel.replaymod.gui.elements.listeners.SelectionListener; +import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.utils.MouseUtils; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.resources.I18n; @@ -35,8 +36,8 @@ public class GuiAssetManager extends GuiScreen { private ReplayAsset currentAsset; - public GuiAssetManager(AssetRepository assetRepository) { - this.assetRepository = assetRepository; + public GuiAssetManager() { + this.assetRepository = ReplayHandler.getAssetRepository(); } @Override @@ -110,6 +111,10 @@ public class GuiAssetManager extends GuiScreen { fileChooser.setAllowedExtensions(currentAsset != null ? AssetFileUtils.fileExtensionsForAssetClass(currentAsset.getClass()) : new String[0]); } }); + + for(ReplayAsset asset : assetRepository.getCopyOfReplayAssets()) { + assetGuiEntryList.addElement(asset); + } } int visibleEntries = (int)Math.floor(((double)this.height-(45+20+15+20))/14); @@ -165,6 +170,11 @@ public class GuiAssetManager extends GuiScreen { protected void keyTyped(char typedChar, int keyCode) throws IOException { Point mousePos = MouseUtils.getMousePos(); composedElement.buttonPressed(mc, mousePos.getX(), mousePos.getY(), typedChar, keyCode); + + if(currentAsset != null) { + currentAsset.setAssetName(assetNameInput.getText()); + } + super.keyTyped(typedChar, keyCode); } @@ -172,4 +182,14 @@ public class GuiAssetManager extends GuiScreen { public void updateScreen() { composedElement.tick(mc); } + + @Override + public void onGuiClosed() { + new Thread(new Runnable() { + @Override + public void run() { + assetRepository.saveAssets(); + } + }, "replaymod-asset-saver").start(); + } } diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java index 6daf301d..c63ffd6c 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java @@ -2,6 +2,7 @@ package eu.crushedpixel.replaymod.replay; import com.mojang.authlib.GameProfile; import eu.crushedpixel.replaymod.ReplayMod; +import eu.crushedpixel.replaymod.assets.AssetRepository; import eu.crushedpixel.replaymod.entities.CameraEntity; import eu.crushedpixel.replaymod.events.KeyframesModifyEvent; import eu.crushedpixel.replaymod.events.ReplayExitEvent; @@ -11,6 +12,8 @@ import eu.crushedpixel.replaymod.settings.RenderOptions; import eu.crushedpixel.replaymod.utils.ReplayFile; import eu.crushedpixel.replaymod.utils.ReplayFileIO; import io.netty.channel.ChannelHandlerContext; +import lombok.Getter; +import lombok.Setter; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNoCallback; @@ -52,6 +55,9 @@ public class ReplayHandler { private static KeyframeSet[] keyframeRepository = new KeyframeSet[]{}; + @Getter @Setter + private static AssetRepository assetRepository; + private static List customImageObjects = new ArrayList(); /** @@ -555,6 +561,10 @@ public class ReplayHandler { PlayerVisibility visibility = currentReplayFile.visibility().get(); PlayerHandler.loadPlayerVisibilityConfiguration(visibility); + //load assets + AssetRepository assets = currentReplayFile.assetRepository().get(); + assetRepository = assets; + ReplayMod.replaySender = new ReplaySender(currentReplayFile, asyncMode); channel.pipeline().addFirst(ReplayMod.replaySender); channel.pipeline().fireChannelActive(); diff --git a/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFile.java b/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFile.java index 3e15e0a3..6e993d83 100644 --- a/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFile.java +++ b/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFile.java @@ -18,6 +18,7 @@ import java.io.*; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; +import java.util.UUID; public class ReplayFile extends ZipFile { @@ -238,11 +239,17 @@ public class ReplayFile extends ZipFile { try { ZipArchiveEntry entry = entries.nextElement(); - if(entry.getName().startsWith(ENTRY_ASSET_FOLDER)) { + String entryName = entry.getName(); + + if(entryName.startsWith(ENTRY_ASSET_FOLDER)) { String name = entry.getName().substring(ENTRY_ASSET_FOLDER.length()); - assetRepository.addAsset(name, getInputStream(entry)); + + String[] split = name.split("_"); + UUID uuid = UUID.fromString(split[0]); + + assetRepository.addAsset(name, getInputStream(entry), uuid); } - } catch(IOException e) { + } catch(Exception e) { e.printStackTrace(); } }